OldBlueWater/BlueWater/Assets/Crest/Crest-Examples/Shared/Scripts/CamController.cs
2023-08-01 13:03:57 +09:00

252 lines
9.0 KiB
C#

// Crest Ocean System
// Copyright 2020 Wave Harmonic Ltd
#if CREST_UNITY_INPUT && ENABLE_INPUT_SYSTEM
#define INPUT_SYSTEM_ENABLED
#endif
using UnityEngine;
#if INPUT_SYSTEM_ENABLED
using UnityEngine.InputSystem;
#endif
#if ENABLE_VR && ENABLE_VR_MODULE
using UnityEngine.XR;
#endif
namespace Crest.Examples
{
/// <summary>
/// A simple and dumb camera script that can be controlled using WASD and the mouse.
/// </summary>
public class CamController : MonoBehaviour
{
/// <summary>
/// The version of this asset. Can be used to migrate across versions. This value should
/// only be changed when the editor upgrades the version.
/// </summary>
[SerializeField, HideInInspector]
#pragma warning disable 414
int _version = 0;
#pragma warning restore 414
public float linSpeed = 10f;
public float rotSpeed = 70f;
public bool simForwardInput = false;
public bool _requireLMBToMove = false;
Vector2 _lastMousePos = -Vector2.one;
bool _dragging = false;
public float _fixedDt = 1 / 60f;
Transform _targetTransform;
#pragma warning disable CS0108
// In editor we need to use "new" to suppress warning but then gives warning when building so use pragma instead.
Camera camera;
#pragma warning restore CS0108
[Space(10)]
[SerializeField]
DebugFields _debug = new DebugFields();
[System.Serializable]
class DebugFields
{
[Tooltip("Allows the camera to roll (rotating on the z axis).")]
public bool _enableCameraRoll = false;
[Tooltip("Disables the XR occlusion mesh for debugging purposes. Only works with legacy XR.")]
public bool _disableOcclusionMesh = false;
[Tooltip("Sets the XR occlusion mesh scale. Useful for debugging refractions. Only works with legacy XR."), UnityEngine.Range(1f, 2f)]
public float _occlusionMeshScale = 1f;
}
void Awake()
{
_targetTransform = transform;
if (!TryGetComponent(out camera))
{
enabled = false;
return;
}
#if ENABLE_VR && ENABLE_VR_MODULE
if (XRSettings.enabled)
{
// Seems like the best place to put this for now. Most XR debugging happens using this component.
// @FixMe: useOcclusionMesh doesn't work anymore. Might be a Unity bug.
XRSettings.useOcclusionMesh = !_debug._disableOcclusionMesh;
XRSettings.occlusionMaskScale = _debug._occlusionMeshScale;
}
#endif
}
void Update()
{
float dt = Time.deltaTime;
if (_fixedDt > 0f)
dt = _fixedDt;
UpdateMovement(dt);
#if ENABLE_VR && ENABLE_VR_MODULE
// These aren't useful and can break for XR hardware.
if (!XRSettings.enabled || XRSettings.loadedDeviceName.Contains("MockHMD"))
#endif
{
UpdateDragging(dt);
UpdateKillRoll();
}
#if ENABLE_VR && ENABLE_VR_MODULE
if (XRSettings.enabled)
{
// Check if property has changed.
if (XRSettings.useOcclusionMesh == _debug._disableOcclusionMesh)
{
// @FixMe: useOcclusionMesh doesn't work anymore. Might be a Unity bug.
XRSettings.useOcclusionMesh = !_debug._disableOcclusionMesh;
}
XRSettings.occlusionMaskScale = _debug._occlusionMeshScale;
}
#endif
}
void UpdateMovement(float dt)
{
// New input system works even when game view is not focused.
if (!Application.isFocused)
{
return;
}
#if INPUT_SYSTEM_ENABLED
if (!Mouse.current.leftButton.isPressed && _requireLMBToMove) return;
float forward = (Keyboard.current.wKey.isPressed ? 1 : 0) - (Keyboard.current.sKey.isPressed ? 1 : 0);
#else
if (!Input.GetMouseButton(0) && _requireLMBToMove) return;
float forward = (Input.GetKey(KeyCode.W) ? 1 : 0) - (Input.GetKey(KeyCode.S) ? 1 : 0);
#endif
if (simForwardInput)
{
forward = 1f;
}
_targetTransform.position += linSpeed * _targetTransform.forward * forward * dt;
var speed = linSpeed;
#if INPUT_SYSTEM_ENABLED
if (Keyboard.current.leftShiftKey.isPressed)
#else
if (Input.GetKey(KeyCode.LeftShift))
#endif
{
speed *= 3f;
}
_targetTransform.position += speed * _targetTransform.forward * forward * dt;
//_transform.position += linSpeed * _transform.right * Input.GetAxis( "Horizontal" ) * dt;
#if INPUT_SYSTEM_ENABLED
_targetTransform.position += linSpeed * _targetTransform.up * (Keyboard.current.eKey.isPressed ? 1 : 0) * dt;
_targetTransform.position -= linSpeed * _targetTransform.up * (Keyboard.current.qKey.isPressed ? 1 : 0) * dt;
_targetTransform.position -= linSpeed * _targetTransform.right * (Keyboard.current.aKey.isPressed ? 1 : 0) * dt;
_targetTransform.position += linSpeed * _targetTransform.right * (Keyboard.current.dKey.isPressed ? 1 : 0) * dt;
_targetTransform.position += speed * _targetTransform.up * (Keyboard.current.eKey.isPressed ? 1 : 0) * dt;
_targetTransform.position -= speed * _targetTransform.up * (Keyboard.current.qKey.isPressed ? 1 : 0) * dt;
_targetTransform.position -= speed * _targetTransform.right * (Keyboard.current.aKey.isPressed ? 1 : 0) * dt;
_targetTransform.position += speed * _targetTransform.right * (Keyboard.current.dKey.isPressed ? 1 : 0) * dt;
#else
_targetTransform.position += linSpeed * _targetTransform.up * (Input.GetKey(KeyCode.E) ? 1 : 0) * dt;
_targetTransform.position -= linSpeed * _targetTransform.up * (Input.GetKey(KeyCode.Q) ? 1 : 0) * dt;
_targetTransform.position -= linSpeed * _targetTransform.right * (Input.GetKey(KeyCode.A) ? 1 : 0) * dt;
_targetTransform.position += linSpeed * _targetTransform.right * (Input.GetKey(KeyCode.D) ? 1 : 0) * dt;
_targetTransform.position += speed * _targetTransform.up * (Input.GetKey(KeyCode.E) ? 1 : 0) * dt;
_targetTransform.position -= speed * _targetTransform.up * (Input.GetKey(KeyCode.Q) ? 1 : 0) * dt;
_targetTransform.position -= speed * _targetTransform.right * (Input.GetKey(KeyCode.A) ? 1 : 0) * dt;
_targetTransform.position += speed * _targetTransform.right * (Input.GetKey(KeyCode.D) ? 1 : 0) * dt;
#endif
{
float rotate = 0f;
#if INPUT_SYSTEM_ENABLED
rotate += (Keyboard.current.rightArrowKey.isPressed ? 1 : 0);
rotate -= (Keyboard.current.leftArrowKey.isPressed ? 1 : 0);
#else
rotate += (Input.GetKey(KeyCode.RightArrow) ? 1 : 0);
rotate -= (Input.GetKey(KeyCode.LeftArrow) ? 1 : 0);
#endif
rotate *= 5f;
Vector3 ea = _targetTransform.eulerAngles;
ea.y += 0.1f * rotSpeed * rotate * dt;
_targetTransform.eulerAngles = ea;
}
}
void UpdateDragging(float dt)
{
// New input system works even when game view is not focused.
if (!Application.isFocused)
{
return;
}
Vector2 mousePos =
#if INPUT_SYSTEM_ENABLED
Mouse.current.position.ReadValue();
#else
Input.mousePosition;
#endif
var wasLeftMouseButtonPressed =
#if INPUT_SYSTEM_ENABLED
Mouse.current.leftButton.wasPressedThisFrame;
#else
Input.GetMouseButtonDown(0);
#endif
if (!_dragging && wasLeftMouseButtonPressed && camera.rect.Contains(camera.ScreenToViewportPoint(mousePos)) &&
!Crest.OceanDebugGUI.OverGUI(mousePos))
{
_dragging = true;
_lastMousePos = mousePos;
}
#if INPUT_SYSTEM_ENABLED
if (_dragging && Mouse.current.leftButton.wasReleasedThisFrame)
#else
if (_dragging && Input.GetMouseButtonUp(0))
#endif
{
_dragging = false;
_lastMousePos = -Vector2.one;
}
if (_dragging)
{
Vector2 delta = mousePos - _lastMousePos;
Vector3 ea = _targetTransform.eulerAngles;
ea.x += -0.1f * rotSpeed * delta.y * dt;
ea.y += 0.1f * rotSpeed * delta.x * dt;
_targetTransform.eulerAngles = ea;
_lastMousePos = mousePos;
}
}
void UpdateKillRoll()
{
if (_debug._enableCameraRoll) return;
Vector3 ea = _targetTransform.eulerAngles;
ea.z = 0f;
transform.eulerAngles = ea;
}
}
}