165 lines
4.6 KiB
C#
165 lines
4.6 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|