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

165 lines
4.6 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;
using UnityEngine.EventSystems;
[RequireComponent(typeof(NavMeshAgent))]
public class NavController : BaseController
{
/// <summary>
/// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʾ<EFBFBD>Ĺ<EFBFBD>Ȧ<EFBFBD><C8A6><EFBFBD><EFBFBD>
/// </summary>
[Tooltip("<22><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʾ<EFBFBD>Ĺ<EFBFBD>Ȧ<EFBFBD><C8A6><EFBFBD><EFBFBD>")]
public GameObject preClick;
/// <summary>
/// <20>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
[Tooltip("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵIJ㣬<C4B2><E3A3AC>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>Ϊ<EFBFBD><CEAA>")]
public LayerMask layer;
/// <summary>
/// <20><>ɫѰ·<D1B0><C2B7>ת<EFBFBD>ٶ<EFBFBD>
/// </summary>
[Tooltip("<22><>ɫѰ·<D1B0><C2B7>ת<EFBFBD>ٶ<EFBFBD>")]
public float rotateSpeed = 50f;
/// <summary>
/// <20><>ɫѰ·<D1B0>ƶ<EFBFBD><C6B6>ٶ<EFBFBD>
/// </summary>
[Tooltip("<22><>ɫѰ·<D1B0>ƶ<EFBFBD><C6B6>ٶ<EFBFBD>")]
public float moveSpeed = 2f;
/// <summary>
/// <20><>ɫѰ·<D1B0><C2B7>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>
/// </summary>
[Tooltip("<22><>ɫѰ·<D1B0><C2B7>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>")]
public float MaxNavDistance = 10f;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
NavMeshAgent agent;
GameObject objClick;
void Start()
{
agent = GetComponent<NavMeshAgent>();
if (agent != null)
{
// <20><>ʼ<EFBFBD><CABC><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>ٶ<EFBFBD>
agent.speed = moveSpeed;
agent.angularSpeed = rotateSpeed;
}
if(transform.parent != null)
objClick = Instantiate(preClick, transform.parent.transform);
else
objClick = Instantiate(preClick);
objClick.SetActive(false);
layerMask = (1 << 0) | (1 << 6); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ㣨ǽ<E3A3A8><C7BD>
}
// <20><><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>
RaycastHit hit;
Ray ray;
int layerMask;
NavMeshHit meshHit;
Vector3 mouseDownPos;
void LateUpdate()
{
if (CanControl
&& agent.enabled
&& !IsTouchOnControl
&& !IsJoyStickOnControl
&& !IsUIClicked)
{
if (Input.GetMouseButtonUp(1) || Input.touchCount == 1)
{
if (!EventSystem.current.IsPointerOverGameObject())
{
if (!IsMouseOnControl && Input.touchCount == 1)
{
ray = CommonData.MainCamera.ScreenPointToRay(Input.touches[0].position);
}
else
{
ray = CommonData.MainCamera.ScreenPointToRay(Input.mousePosition);
}
if (Physics.Raycast(ray, out hit, MaxNavDistance, layerMask))
{
// Debug.Log(hit.collider.name);
// <20>жϵ<D0B6><CFB5><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õIJ<C3B5><C4B2>Ƿ<EFBFBD>һ<EFBFBD><D2BB>
if (Mathf.Pow(2, hit.collider.gameObject.layer) == layer.value)
{
if (NavMesh.SamplePosition(hit.point, out meshHit, 1.0f, NavMesh.AllAreas))
{
// agent.enabled = true;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>λ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ʾ
objClick.transform.position = hit.point;
objClick.SetActive(true);
// <20>Զ<EFBFBD>Ѱ·<D1B0><C2B7>Ŀ<EFBFBD><C4BF>λ<EFBFBD><CEBB>
agent.isStopped = false;
agent.SetDestination(hit.point);
// <20><>ʶ<EFBFBD>Զ<EFBFBD>Ѱ·<D1B0><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IsNavOnControl = true;
}
}
}
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣѰ·
// if (IsMouseOnControl || IsKeyOnControl || IsJoyStickOnControl)
if (IsKeyOnControl || IsJoyStickOnControl)
{
StopNav();
}
if (IsNavOnControl && !IsMoving())
{
IsNavOnControl = false;
}
}
/// <summary>
/// ֹͣѰ·
/// </summary>
public void StopNav()
{
if (agent.enabled)
{
agent.isStopped = true; // ֹͣ<CDA3>Զ<EFBFBD>Ѱ·
}
objClick.SetActive(false); // <20><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IsNavOnControl = false;
// agent.enabled = false;
}
// Unity<74><79><EFBFBD><EFBFBD><EFBFBD>Ƿ񵽴<C7B7>Ŀ<EFBFBD>ĵصķ<D8B5><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ĵأ<C4B5>
public bool IsMoving()
{
if (!agent.enabled)
return false;
//bool r = agent.pathPending || agent.remainingDistance > agent.stoppingDistance || agent.velocity != Vector3.zero;
//r = agent.enabled ? r : false;
//return r;
return agent.enabled ?
agent.pathPending || agent.remainingDistance > agent.stoppingDistance || agent.velocity != Vector3.zero
:
false;
}
}