Files
TaiWan/Assets/Roaming/Scripts/Controller/Camera/MouseController.cs

271 lines
7.1 KiB
C#
Raw Normal View History

2025-10-31 15:20:38 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class MouseController : BaseController
{
/// <summary>
/// <20><><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>Transform
/// <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ǰ<EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>
/// </summary>
[Tooltip("<22><><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>Transform<72><6D>Ĭ<EFBFBD><C4AC>Ϊ<EFBFBD><CEAA>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>")]
public Transform tran;
[Tooltip("<22><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת")]
public bool RotateEnabled = true;
[Tooltip("<22><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>")]
public bool MoveEnabled = true;
[Tooltip("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>")]
public bool CameraFovEnabled = true;
void Start()
{
if (tran == null)
tran = transform;
agent = GetComponent<NavMeshAgent>();
if (H5Controller.IsMobileBroswer())
{
Destroy(this);
}
}
void Update()
{
if (CanControl && !IsJoyStickOnControl)
{
if (RotateEnabled)
RotateWithMouse();
if (MoveEnabled)
MoveWithMidBtn();
if (CameraFovEnabled)
CameraFOVWithWheel();
}
}
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
float mouseX;
float mouseY;
float rotationX;
float rotationY;
Quaternion rotation;
[Header("<22><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>")]
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶķ<C6B5><C4B7><EFBFBD>ö<EFBFBD><C3B6>
/// </summary>
[Tooltip("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶķ<C6B5><C4B7><EFBFBD>ö<EFBFBD><C3B6>")]
public RotationAxes axes = RotationAxes.MouseXAndY;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
[Tooltip("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD>")]
public int yRotationMinLimit = -10;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
[Tooltip("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD>")]
public int yRotationMaxLimit = 30;
/// <summary>
/// ˮƽ<CBAE><C6BD>ת<EFBFBD>ٶ<EFBFBD>
/// </summary>
[Tooltip("ˮƽ<CBAE><C6BD>ת<EFBFBD>ٶ<EFBFBD>")]
public float xRotationSpeed = 3;
/// <summary>
/// <20><>ֱ<EFBFBD><D6B1>ת<EFBFBD>ٶ<EFBFBD>
/// </summary>
[Tooltip("<22><>ֱ<EFBFBD><D6B1>ת<EFBFBD>ٶ<EFBFBD>")]
public float yRotationSpeed = 3;
/// <summary>
/// <20>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD>Ϊˮƽ<CBAE><C6BD><EFBFBD>ٶ<EFBFBD>
/// </summary>
[Tooltip("<22>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD>Ϊˮƽ<CBAE><C6BD><EFBFBD>ٶ<EFBFBD>")]
public float resetAngleSpeed = 1f;
NavMeshAgent agent;
Vector3 upPos;
Vector3 vTmp;
void RotateWithMouse()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((Input.touchCount == 0 && Input.GetMouseButton(0)) || Input.touchCount == 1)
{
// agent.enabled = false;
IsMouseOnControl = true;
if (axes == RotationAxes.MouseXAndY)
{
rotationX = CommonData.MainCamera.transform.localEulerAngles.y + Input.GetAxis("Mouse X") * xRotationSpeed;
rotationY += Input.GetAxis("Mouse Y") * yRotationSpeed;
rotationY = Mathf.Clamp(rotationY, yRotationMinLimit, yRotationMaxLimit);
CommonData.MainCamera.transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.MouseX)
{
CommonData.MainCamera.transform.Rotate(0, Input.GetAxis("Mouse X") * yRotationSpeed, 0);
}
else
{
rotationY += Input.GetAxis("Mouse Y") * yRotationSpeed;
rotationY = Mathf.Clamp(rotationY, yRotationMinLimit, yRotationMaxLimit);
CommonData.MainCamera.transform.localEulerAngles = new Vector3(-rotationY, CommonData.MainCamera.transform.localEulerAngles.y, 0);
}
//GetComponent<NavMeshAgent>().enabled = false;
}
if (Input.GetMouseButtonUp(0))
{
rotationX = 0;
rotationY = 0;
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>תλ<D7AA><CEBB>
upPos = tran.localRotation.eulerAngles;
if (upPos.x > yRotationMaxLimit + 1)
{
upPos.x -= 360f;
}
IsMouseOnControl = false;
}
if (IsMouseOnControl && agent != null && !agent.enabled)
{
vTmp = tran.localRotation.eulerAngles;
if (Mathf.Abs(vTmp.x) <= 0.01f)
{
vTmp.x = 0;
// agent.enabled = true;
IsMouseOnControl = false;
}
else
{
vTmp.x -= Time.deltaTime * upPos.x * resetAngleSpeed;
if ((upPos.x > 0 && vTmp.x <= 0) || (upPos.x < 0 && vTmp.x >= 360f))
{
vTmp.x = 0;
// agent.enabled = true;
IsMouseOnControl = false;
}
}
tran.localRotation = Quaternion.Euler(vTmp);
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>ĽǶ<C4BD>
/// </summary>
/// <param name="value"><3E>Ƕ<EFBFBD>ֵ</param>
/// <param name="min"><3E><>Сֵ</param>
/// <param name="max"><3E><><EFBFBD><EFBFBD>ֵ</param>
float ClampValue(float value, float min, float max)
{
// <20>޶<EFBFBD><DEB6><EFBFBD>0-360֮<30><D6AE>
if (value <= -360)
value += 360;
if (value >= 360)
value -= 360;
//<2F><><EFBFBD><EFBFBD>value<75><65>ֵ<EFBFBD><D6B5>min<69><6E>max֮<78><EFBFBD><E4A3AC><EFBFBD><EFBFBD>valueС<65><D0A1>min<69><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>min<69><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>value<75><65><EFBFBD><EFBFBD>max<61><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>max<61><78><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>value
return Mathf.Clamp(value, min, max);
}
#endregion
#region <EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
float mouseX2;
float mouseY2;
Vector3 moveDir;
/// <summary>
/// <20>м<EFBFBD><D0BC>ƶ<EFBFBD><C6B6>ٶ<EFBFBD>
/// </summary>
[Header("<22><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>")]
[Tooltip("<22>м<EFBFBD><D0BC>ƶ<EFBFBD><C6B6>ٶ<EFBFBD>")]
public float moveSpeed = 1;
/// <summary>
/// <20>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
/// </summary>
public void MoveWithMidBtn()
{
if (Input.GetMouseButton(2))
{
mouseX2 = Input.GetAxis("Mouse X");
mouseY2 = Input.GetAxis("Mouse Y");
if (mouseX2 != 0 || mouseY2 != 0)
{
IsMouseOnControl = true;
//<2F><><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Vector3<72><33><EFBFBD>ͣ<EFBFBD>ʵ<EFBFBD><CAB5>ԭ<EFBFBD><D4AD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļӷ<C4BC><D3B7><EFBFBD>
moveDir = (mouseX2 * -tran.right + mouseY2 * -tran.forward);
//<2F><><EFBFBD><EFBFBD>y<EFBFBD><79><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
moveDir.y = 0;
tran.position += moveDir * 0.5f * moveSpeed;
}
}
if (Input.GetMouseButtonUp(2))
{
IsMouseOnControl = false;
}
}
#endregion
#region <EFBFBD><EFBFBD><EFBFBD>ֿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
float fov; // <20>Ƕ<EFBFBD>
float wheel; // <20><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
/// <summary>
/// fov <20><>С<EFBFBD>Ƕ<EFBFBD>
/// </summary>
[Tooltip("fov <20><>С<EFBFBD>Ƕ<EFBFBD>")]
public int fovMinLimit = 25;
/// <summary>
/// fov <20><><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>
/// </summary>
[Tooltip("fov <20><><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>")]
public int fovMaxLimit = 75;
/// <summary>
/// fov <20><EFBFBD>ٶ<EFBFBD>
/// </summary>
[Tooltip("fov <20><EFBFBD>ٶ<EFBFBD>")]
public float fovSpeed = 50.0f;
/// <summary>
/// <20><><EFBFBD>ֿ<EFBFBD><D6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public void CameraFOVWithWheel()
{
wheel = Input.GetAxis("Mouse ScrollWheel");
if (wheel != 0)
{
fov = CommonData.MainCamera.fieldOfView;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵĻ<D6B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
fov += wheel * Time.deltaTime * 100 * fovSpeed;
// fov <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fov = Mathf.Clamp(fov, fovMinLimit, fovMaxLimit);
//<2F>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> fov
CommonData.MainCamera.fieldOfView = fov;
}
}
#endregion
}
/// <summary>
/// <20><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
/// </summary>
public enum RotationAxes
{
MouseXAndY,
MouseX,
MouseY
}