224 lines
8.0 KiB
C#
224 lines
8.0 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[Serializable]
|
|
public class Tank : MonoBehaviour
|
|
{
|
|
public Vehicle vehicle;
|
|
public GameObject tracks;
|
|
public GameObject tracksSimple;
|
|
public int tracksPerSide = 3;
|
|
public float trackSpacing = 2.5f;
|
|
public GameObject superTracks;
|
|
public GameObject simpleTracks;
|
|
|
|
public void InitVehicle(Vehicle veh)
|
|
{
|
|
vehicle = veh;
|
|
|
|
List<Material> materialAccents = new List<Material>();
|
|
|
|
//Build Tracks
|
|
GameObject track;
|
|
superTracks = new GameObject("Tracks");
|
|
superTracks.transform.parent = transform;
|
|
for (int i = 0; i < tracksPerSide; i++)
|
|
{
|
|
//Left Side
|
|
track = (GameObject)Instantiate(
|
|
tracks,
|
|
transform.TransformPoint(new Vector3(
|
|
-2,
|
|
0,
|
|
-(((tracksPerSide - 1) * trackSpacing) / 2) +
|
|
i * trackSpacing)),
|
|
transform.rotation);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Detailed/Track")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Detailed/Tread")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Simple")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
track.transform.parent = superTracks.transform;
|
|
//Right Side
|
|
track = (GameObject)Instantiate(
|
|
tracks,
|
|
transform.TransformPoint(new Vector3(
|
|
2,
|
|
0,
|
|
-(((tracksPerSide - 1) * trackSpacing) / 2) +
|
|
i * trackSpacing)),
|
|
transform.rotation);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Detailed/Track")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Detailed/Tread")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Simple")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
track.transform.parent = superTracks.transform;
|
|
((TankTrack)track.GetComponent(typeof(TankTrack))).rightSide = true;
|
|
}
|
|
|
|
if (!vehicle.networkView.isMine)
|
|
{
|
|
simpleTracks = new GameObject();
|
|
simpleTracks.transform.parent = transform;
|
|
for (int i = 0; i < tracksPerSide; i++)
|
|
{
|
|
//Left Side
|
|
track = (GameObject)Instantiate(
|
|
tracks,
|
|
transform.TransformPoint(new Vector3(
|
|
-2,
|
|
0.2f,
|
|
-(((tracksPerSide - 1) * trackSpacing) / 2) +
|
|
i * trackSpacing)),
|
|
transform.rotation);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Detailed/Track")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Detailed/Tread")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Simple")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
track.transform.parent = simpleTracks.transform;
|
|
|
|
//Right Side
|
|
track = (GameObject)Instantiate(
|
|
tracks,
|
|
transform.TransformPoint(new Vector3(
|
|
2,
|
|
0.2f,
|
|
-(((tracksPerSide - 1) * trackSpacing) / 2) +
|
|
i * trackSpacing)),
|
|
transform.rotation);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Detailed/Track")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Detailed/Tread")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
materialAccents.Add(
|
|
((MeshRenderer)track.transform
|
|
.Find("Simple")
|
|
.GetComponent(typeof(MeshRenderer)))
|
|
.material);
|
|
track.transform.parent = simpleTracks.transform;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
TankMe tankMe = (TankMe)this.gameObject.AddComponent(typeof(TankMe));
|
|
tankMe.vehicle = vehicle;
|
|
}
|
|
|
|
vehicle.materialAccent = (Material[])materialAccents.ToArray();
|
|
|
|
if ((bool)World.baseTF)
|
|
{ //DRAGONHERE: why we need to do this I don't know, but if we don't, we will hover in mid air on local client instances
|
|
transform.position = World.baseTF.position;
|
|
}
|
|
//DRAGONHERE: VERY STRANGE UNITY BUG that sets localposition to -3 if a tank is already present in world...
|
|
transform.localPosition = Vector3.zero;
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (!vehicle) return;
|
|
|
|
Vector3 centerOfMass = vehicle.myRigidbody.centerOfMass;
|
|
centerOfMass.y = Game.Settings.tankCG;
|
|
vehicle.myRigidbody.centerOfMass = centerOfMass;
|
|
|
|
if (!vehicle.networkView.isMine && (bool)vehicle.vehicleNet)
|
|
{
|
|
//Enable advanced physics
|
|
if (vehicle.vehicleNet.simulatePhysics && simpleTracks.active)
|
|
{
|
|
vehicle.myRigidbody.useGravity = true; //Gravity is simulated on the authoratative client instance that owns this tank - it just makes the networked instances jittery
|
|
simpleTracks.SetActiveRecursively(false);
|
|
superTracks.SetActiveRecursively(true);
|
|
}
|
|
//Disable advanced physics
|
|
else if (!vehicle.vehicleNet.simulatePhysics && superTracks.active)
|
|
{
|
|
vehicle.myRigidbody.useGravity = true; //Gravity is simulated on the authoratative client instance that owns this tank - it just makes the networked instances jittery
|
|
simpleTracks.SetActiveRecursively(true);
|
|
superTracks.SetActiveRecursively(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OnLOD(int level)
|
|
{
|
|
if ((bool)superTracks)
|
|
{
|
|
foreach(Transform track in superTracks.transform)
|
|
{
|
|
((MeshRenderer)track
|
|
.Find("Detailed/Tread")
|
|
.gameObject.GetComponent(typeof(MeshRenderer))
|
|
).enabled = (level == 0);
|
|
((MeshRenderer)track
|
|
.Find("Detailed/Track")
|
|
.gameObject.GetComponent(typeof(MeshRenderer))
|
|
).enabled = (level == 0);
|
|
((MeshRenderer)track
|
|
.Find("Simple")
|
|
.gameObject.GetComponent(typeof(MeshRenderer))
|
|
).enabled = (level != 0);
|
|
}
|
|
}
|
|
if ((bool)simpleTracks)
|
|
{
|
|
foreach (Transform track in simpleTracks.transform)
|
|
{
|
|
((MeshRenderer)track
|
|
.Find("Detailed/Tread")
|
|
.gameObject.GetComponent(typeof(MeshRenderer))
|
|
).enabled = (level == 0);
|
|
((MeshRenderer)track
|
|
.Find("Detailed/Track")
|
|
.gameObject.GetComponent(typeof(MeshRenderer))
|
|
).enabled = (level == 0);
|
|
((MeshRenderer)track
|
|
.Find("Simple")
|
|
.gameObject.GetComponent(typeof(MeshRenderer))
|
|
).enabled = (level != 0);
|
|
}
|
|
}
|
|
}
|
|
}
|