123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- using UnityEngine;
- using UnityEngine.AI;
- namespace Mirror.Examples.Tanks
- {
- public class Tank : NetworkBehaviour
- {
- [Header("Components")]
- public NavMeshAgent agent;
- public Animator animator;
- public TextMesh healthBar;
- [Header("Movement")]
- public float rotationSpeed = 100;
- [Header("Firing")]
- public KeyCode shootKey = KeyCode.Space;
- public GameObject projectilePrefab;
- public Transform projectileMount;
- [Header("Stats")]
- [SyncVar] public int health = 4;
- void Update()
- {
- // always update health bar.
- // (SyncVar hook would only update on clients, not on server)
- healthBar.text = new string('-', health);
- // movement for local player
- if (isLocalPlayer)
- {
- // rotate
- float horizontal = Input.GetAxis("Horizontal");
- transform.Rotate(0, horizontal * rotationSpeed * Time.deltaTime, 0);
- // move
- float vertical = Input.GetAxis("Vertical");
- Vector3 forward = transform.TransformDirection(Vector3.forward);
- agent.velocity = forward * Mathf.Max(vertical, 0) * agent.speed;
- animator.SetBool("Moving", agent.velocity != Vector3.zero);
- // shoot
- if (Input.GetKeyDown(shootKey))
- {
- CmdFire();
- }
- }
- }
- // this is called on the server
- [Command]
- void CmdFire()
- {
- GameObject projectile = Instantiate(projectilePrefab, projectileMount.position, transform.rotation);
- NetworkServer.Spawn(projectile);
- RpcOnFire();
- }
- // this is called on the tank that fired for all observers
- [ClientRpc]
- void RpcOnFire()
- {
- animator.SetTrigger("Shoot");
- }
- [ServerCallback]
- void OnTriggerEnter(Collider other)
- {
- if (other.GetComponent<Projectile>() != null)
- {
- --health;
- if (health == 0)
- NetworkServer.Destroy(gameObject);
- }
- }
- }
- }
|