Files
beyond/Assets/ThirdParty/Invector-3rdPersonController/Basic Locomotion/Scripts/Generic/Utils/vMousePositionHandler.cs
2024-11-20 15:21:28 +01:00

156 lines
5.8 KiB
C#

using UnityEngine;
#if MOBILE_INPUT
using UnityStandardAssets.CrossPlatformInput;
#endif
namespace Invector.vCharacterController
{
public class vMousePositionHandler : MonoBehaviour
{
public Camera mainCamera;
protected static vMousePositionHandler _instance;
public static vMousePositionHandler Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<vMousePositionHandler>();
}
if (_instance == null)
{
var go = new GameObject("MousePositionHandler");
_instance = go.AddComponent<vMousePositionHandler>();
_instance.mainCamera = Camera.main;
}
return _instance;
}
}
public string joystickHorizontalAxis = "RightAnalogHorizontal";
public string joystickVerticalAxis = "RightAnalogVertical";
public float joystickSensitivity = 25f;
public bool clampScreen = true;
public Vector2 joystickMousePos;
public virtual void SetMousePosition(Vector2 pos)
{
joystickMousePos = pos;
}
public virtual Vector2 mousePosition
{
get
{
var inputDevice = vInput.instance.inputDevice;
switch (inputDevice)
{
case InputDevice.MouseKeyboard:
return Input.mousePosition;
case InputDevice.Joystick:
joystickMousePos.x += Input.GetAxis("RightAnalogHorizontal") * joystickSensitivity;
joystickMousePos.x = Mathf.Clamp(joystickMousePos.x, -(Screen.width * 0.5f), (Screen.width * 0.5f));
joystickMousePos.y += Input.GetAxis("RightAnalogVertical") * joystickSensitivity;
joystickMousePos.y = Mathf.Clamp(joystickMousePos.y, -(Screen.height * 0.5f), (Screen.height * 0.5f));
var screenCenter = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f);
var result = joystickMousePos + screenCenter;
result.x = Mathf.Clamp(result.x, 0, Screen.width);
result.y = Mathf.Clamp(result.y, 0, Screen.height);
return result;
case InputDevice.Mobile:
if (clampScreen)
{
#if MOBILE_INPUT
joystickMousePos.x += CrossPlatformInputManager.GetAxis("RightAnalogHorizontal") * joystickSensitivity;
joystickMousePos.x = Mathf.Clamp(joystickMousePos.x, -(Screen.width * 0.5f), (Screen.width * 0.5f));
joystickMousePos.y += CrossPlatformInputManager.GetAxis("RightAnalogVertical") * joystickSensitivity;
joystickMousePos.y = Mathf.Clamp(joystickMousePos.y, -(Screen.height * 0.5f), (Screen.height * 0.5f));
var mobileScreenCenter = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f);
var mobileResult = joystickMousePos + mobileScreenCenter;
mobileResult.x = Mathf.Clamp(mobileResult.x, 0, Screen.width);
mobileResult.y = Mathf.Clamp(mobileResult.y, 0, Screen.height);
return mobileResult;
#else
return Input.GetTouch(0).deltaPosition;
#endif
}
else
{
return joystickMousePos;
}
default: return Input.mousePosition;
}
}
}
public virtual Vector3 WorldMousePosition(LayerMask castLayer, out Collider collider)
{
if (!mainCamera)
{
if (!Camera.main)
{
Debug.LogWarning("Trying to get the world mouse position but a MainCamera is missing from the scene");
collider = null;
return Vector3.zero;
}
else
{
mainCamera = Camera.main;
collider = null;
return Vector3.zero;
}
}
else
{
Ray ray = mainCamera.ScreenPointToRay(mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, mainCamera.farClipPlane, castLayer))
{
collider = hit.collider;
return hit.point;
}
else
{
collider = null;
return ray.GetPoint(mainCamera.farClipPlane);
}
}
}
public virtual Vector3 WorldMousePosition(LayerMask castLayer)
{
if (!mainCamera)
{
if (!Camera.main)
{
Debug.LogWarning("Trying to get the world mouse position but a MainCamera is missing from the scene");
return Vector3.zero;
}
else
{
mainCamera = Camera.main;
return Vector3.zero;
}
}
else
{
Ray ray = mainCamera.ScreenPointToRay(mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, mainCamera.farClipPlane, castLayer))
{
return hit.point;
}
else
{
return ray.GetPoint(mainCamera.farClipPlane);
}
}
}
}
}