using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Omni { public class OmniController : MonoBehaviour { #region Movement Variable [Header("-----Movement Options-----")] [Tooltip("Affects overall speed forward, back, left, right.")] public float maxSpeed = 10; [Range(0.0f, 1.0f)] [Tooltip("Multiplier to reduce strafing speed (Strafing at full speed can feel too fast).")] public float strafeSpeedMultiplier = 1.0f; [Range(0.0f, 1.0f)] [Tooltip("Multiplier to reduce backwards speed (Moving backwards at full speed can feel too fast).")] public float backwardsSpeedMultiplier = 1.0f; [Tooltip("Multiplier for gravity for character controller.")] public float gravityMultiplier = 1; #endregion [Header("-----GameObject References-----")] public Transform cameraReference; public Transform dummyObject; protected Vector3 dummyForward; private Vector3 forwardMovement; private Vector3 strafeMovement; protected OmniManager omniManager; protected OmniSetupComponent omniSetupComponent; protected OmniConnectionComponent omniConnectionComponent; protected OmniDataComponent omniDataComponent; // Start is called before the first frame update protected void Setup(bool developerMode = false) { omniManager = new OmniManager(); omniSetupComponent = new OmniSetupComponent(); gameObject.AddComponent(); gameObject.AddComponent(); omniConnectionComponent = GetComponent(); omniDataComponent = GetComponent(); //cameraReference = GameObject.FindGameObjectWithTag("MainCamera").GetComponent().transform; omniDataComponent.Setup(omniManager); omniSetupComponent.Setup(omniManager, omniConnectionComponent, omniDataComponent); InitializeForOmni(developerMode); omniConnectionComponent.Connect(omniDataComponent); } private bool IsCameraReferenceUnknown() { if (cameraReference == null) { Debug.LogError("Camera Reference not set in prefab."); return true; } return false; } protected virtual void InitializeForOmni(bool developerMode = false) { if (developerMode) { if (IsCameraReferenceUnknown()) return; if (!omniSetupComponent.IsPresent()) { cameraReference.gameObject.AddComponent(); Vector3 adjustedCameraPosition = cameraReference.localPosition; adjustedCameraPosition.y = 1.5f; cameraReference.localPosition = adjustedCameraPosition; } } if (omniManager.FindOmni()) { Debug.Log(System.DateTime.Now.ToLongTimeString() + ": OmniMovementComponent(OmniInitialize) - Successfully found the Omni."); omniConnectionComponent.omniFound = true; } else { Debug.LogError(System.DateTime.Now.ToLongTimeString() + ": OmniMovementComponent(OmniInitialize) - Attempted to Initialize the Omni, but Omni not found."); omniConnectionComponent.omniFound = false; return; } } public void GetOmniInputForCharacterMovement(int forwardRotationOffset = 0, bool needsCoupling = true) { if (IsCameraReferenceUnknown()) return; Vector2 hidInput = omniDataComponent.hidInput; forwardMovement = new Vector3(0.0f, 0.0f, 0.0f); strafeMovement = forwardMovement; //calculate angle between camera and omni omniDataComponent.ComputeAngleBetweenControllerAndCamera(cameraReference); float forwardRotation = omniDataComponent.CalculateForwardRotation(needsCoupling) + forwardRotationOffset; //display forward rotation defined by our coupling percentage dummyObject.rotation = Quaternion.Euler(0, forwardRotation, 0); dummyForward = dummyObject.forward; //calculate forward movement Vector3 movementInputVector = new Vector3(hidInput.y * dummyForward.x, 0, hidInput.y * dummyForward.z); //apply multiplier to reduce backwards movement speed by a given percentage if (hidInput.y < 0) { movementInputVector *= backwardsSpeedMultiplier; } //display rounded values if (dummyForward.x != 0) dummyForward.x = Mathf.Round(dummyForward.x * 100) / 100; if (dummyForward.z != 0) dummyForward.z = Mathf.Round(dummyForward.z * 100) / 100; //apply gravity movementInputVector += Physics.gravity * gravityMultiplier; //perform forward movement forwardMovement = (movementInputVector * maxSpeed * Time.deltaTime); if (hidInput.x != 0) { //calculate strafe movement movementInputVector = new Vector3(hidInput.x * dummyObject.right.x, 0, hidInput.x * dummyObject.right.z); //apply modifier to reduce strafe movement by a given percentage movementInputVector *= strafeSpeedMultiplier; //apply gravity movementInputVector += Physics.gravity * gravityMultiplier; //perform strafe movement strafeMovement = (movementInputVector * maxSpeed * Time.deltaTime); } } public Vector3 GetForwardMovement() { return forwardMovement; } public Vector3 GetStrafeMovement() { return strafeMovement; } public void UpdateForOmni() { omniDataComponent.ReadAndSetOmniData(omniConnectionComponent, omniSetupComponent.IsInitialized()); omniSetupComponent.CalibrateOmni(cameraReference); } //called on exit void OnApplicationQuit() { omniSetupComponent.StopOmni(); } //called on scene change void OnDisable() { omniSetupComponent.StopOmni(); omniConnectionComponent.StopReconnectAttempts(); } } }