1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- using UnityEngine;
- using UnityEngine.AI;
- namespace Mirror.Examples.Tanks
- {
- public class Tank : NetworkBehaviour
- {
- [Header("Components")]
- public NavMeshAgent agent;
- public Animator animator;
- public TextMesh healthBar;
- public Transform turret;
- [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);
-
- // take input from focused window only
- if(!Application.isFocused) return;
- // 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();
- }
- RotateTurret();
- }
- }
- // this is called on the server
- [Command]
- void CmdFire()
- {
- GameObject projectile = Instantiate(projectilePrefab, projectileMount.position, projectileMount.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);
- }
- }
- void RotateTurret()
- {
- Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- if (Physics.Raycast(ray, out RaycastHit hit, 100))
- {
- Debug.DrawLine(ray.origin, hit.point);
- Vector3 lookRotation = new Vector3(hit.point.x, turret.transform.position.y, hit.point.z);
- turret.transform.LookAt(lookRotation);
- }
- }
- }
- }
|