same movement as Unity editor control.
I just tried to use those standard movement script from unity in my project.
and this one support NetworkIdentity (optional)
ObserverMovement.cs
using UnityEngine; using UnityEngine.Networking; public class ObserverMovement : MonoBehaviour { [Header("Common")] public float m_Speed = 0.5f; public float m_HighSpeed = 2f; public bool m_AsFlightControl = false; [Header("Optional")] public NetworkIdentity m_NetworkIdentity; public Camera m_Camera; private float m_CurrentSpeed = 0f; private bool m_ToggleSpeed = false; private Vector3 m_LocalTranslate = Vector3.zero; private Vector2 m_LocalLook = Vector2.zero; void OnValidate() { if (m_NetworkIdentity == null) { m_NetworkIdentity = GetComponent<NetworkIdentity>(); } if (m_NetworkIdentity != null && m_Camera == null) { m_Camera = GetComponentInChildren<Camera>(true); } } void InputUpdate() { // Mouse look if (Input.GetMouseButtonDown(1) && Cursor.lockState != CursorLockMode.Locked) { Cursor.lockState = CursorLockMode.Locked; } if (Input.GetMouseButtonUp(1) && Cursor.lockState != CursorLockMode.None) { Cursor.lockState = CursorLockMode.None; } if (Cursor.lockState == CursorLockMode.Locked) { m_LocalLook.x = -Input.GetAxis("Mouse Y"); m_LocalLook.y = Input.GetAxis("Mouse X"); } // Speed if (!m_ToggleSpeed && Input.GetKeyDown(KeyCode.LeftShift) || Input.GetKeyDown(KeyCode.RightShift)) { m_ToggleSpeed = true; } else if (m_ToggleSpeed && (Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.RightShift)) && !(Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.RightShift))) { m_ToggleSpeed = false; } m_CurrentSpeed = (m_ToggleSpeed) ? m_HighSpeed : m_Speed; // Movement if (Input.GetAxis("Vertical") != 0) { m_LocalTranslate += transform.forward * m_CurrentSpeed * Input.GetAxis("Vertical"); } if (Input.GetAxis("Horizontal") != 0) { m_LocalTranslate += transform.right * m_CurrentSpeed * Input.GetAxis("Horizontal"); } if (Input.GetKey(KeyCode.E) && !Input.GetKey(KeyCode.Q)) { m_LocalTranslate += transform.up * m_CurrentSpeed * 0.5f; } if (Input.GetKey(KeyCode.Q) && !Input.GetKey(KeyCode.E)) { m_LocalTranslate += -transform.up * m_CurrentSpeed * 0.5f; } } void Update() { if(m_NetworkIdentity != null && !m_NetworkIdentity.isLocalPlayer) { if (m_Camera != null) m_Camera.enabled = false; enabled = false; return; } InputUpdate(); // Apply transform.Translate(m_LocalTranslate, Space.World); if (Cursor.lockState == CursorLockMode.Locked) { transform.Rotate(Vector3.right, m_LocalLook.x, Space.Self); transform.Rotate(Vector3.up, m_LocalLook.y, (m_AsFlightControl) ? Space.Self : Space.World); } // Reset m_LocalTranslate = Vector3.zero; m_LocalLook = Vector2.zero; } }