using FishNet.Object; using UnityEngine; namespace FishNet.Demo.HashGrid { public class MoveRandomly : NetworkBehaviour { //Colors green for client. [SerializeField] private Renderer _renderer; //How quickly to move over 1s. private float _moveRate = 0.5f; //Maximum range for new position. public const float Range = 25f; //Position to move towards. private Vector3 _goal; //Position at spawn. private Vector3 _start; private void Update() { if (!base.IsController) return; transform.position = Vector3.MoveTowards(transform.position, _goal, (_moveRate * Time.deltaTime)); if (transform.position == _goal) RandomizeGoal(); } public override void OnStartNetwork() { _start = transform.position; RandomizeGoal(); } public override void OnStartServer() { if (!base.Owner.IsValid) transform.position = (_start + RandomInsideRange()); } public override void OnStartClient() { if (base.Owner.IsLocalClient) { _renderer.material.color = Color.green; _moveRate *= 3f; transform.position -= new Vector3(0f, 0f, 1f); Camera c = Camera.main; c.transform.SetParent(transform); c.transform.localScale = Vector3.one; c.transform.localPosition = new(0f, 0f, -5f); } else { _renderer.material.color = Color.gray; } } public override void OnStopClient() { if (base.IsOwner) { Camera c = Camera.main; if (c != null) { c.transform.SetParent(null); c.transform.localScale = Vector3.one; } } } private void RandomizeGoal() { _goal = _start + RandomInsideRange(); } private Vector3 RandomInsideRange() { Vector3 goal = (Random.insideUnitSphere * Range); goal.z = transform.position.z; return goal; } } }