6 changed files with 4849 additions and 3044 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,125 @@
|
||||
using System.Collections; |
||||
using System.Collections.Generic; |
||||
using UnityEngine; |
||||
using UnityEngine.AI; |
||||
|
||||
public class PathFinding : MonoBehaviour |
||||
{ |
||||
public Transform PathParent; |
||||
public List<Transform> PathList = new List<Transform>(); |
||||
public int NowIndex = 0; |
||||
// Start is called before the first frame update |
||||
void Start() |
||||
{ |
||||
foreach (Transform item in PathParent) |
||||
{ |
||||
if (item != PathParent) |
||||
PathList.Add(item); |
||||
} |
||||
} |
||||
|
||||
// Update is called once per frame |
||||
void Update() |
||||
{ |
||||
if (Input.GetKeyDown(KeyCode.T)) |
||||
{ |
||||
if (NowIndex == 0) |
||||
{ |
||||
LocationData data = new LocationData(); |
||||
data.targetNo = 102; |
||||
data.xAxis = PathList[0].transform.position.x; |
||||
data.yAxis = PathList[0].transform.position.y; |
||||
data.zAxis = PathList[0].transform.position.z; |
||||
data.stations = PathList[0].name; |
||||
var agent = GetComponent<LocationSimulator>().CreateAgent(data); |
||||
agent.enabled = false; |
||||
agent.GetComponent<NavMeshAgent>().enabled = false; |
||||
GetComponent<LocationSimulator>().agentControllers.Add(data.targetNo, agent); |
||||
Vector3 pos = ConversionTransform(data); |
||||
GetComponent<LocationSimulator>().agentControllers[data.targetNo].transform.position = pos; |
||||
} |
||||
else if (NowIndex < PathList.Count) |
||||
{ |
||||
LocationData data = new LocationData(); |
||||
data.targetNo = 102; |
||||
data.stations = PathList[NowIndex].name; |
||||
data.xAxis = PathList[NowIndex].transform.position.x; |
||||
data.yAxis = PathList[NowIndex].transform.position.y; |
||||
data.zAxis = PathList[NowIndex].transform.position.z; |
||||
Vector3 pos = ConversionTransform(data); |
||||
GetComponent<LocationSimulator>().agentControllers[data.targetNo].transform.position = pos; |
||||
} |
||||
else |
||||
{ |
||||
NowIndex = 0; |
||||
} |
||||
NowIndex++; |
||||
} |
||||
} |
||||
/// <summary> |
||||
/// 根据数据转换到Unity坐标 |
||||
/// </summary> |
||||
/// <param name="data"></param> |
||||
/// <returns></returns> |
||||
public Vector3 ConversionTransform(LocationData data) |
||||
{ |
||||
//判断数据被检测到的区域 |
||||
string St1 = "1";//楼梯入口基站 |
||||
string St2 = "2";//楼梯间基站 |
||||
string St3 = "3";//楼梯底层基站 |
||||
//纠正坐标 |
||||
Vector3 p1 = new Vector3(-15.48f, -17.7f, 41.83f);//1.7 |
||||
Vector3 p2 = new Vector3(-15.48f, -19.3f, 37.48f);//1.4 |
||||
Vector3 p3 = new Vector3(-17.47f, -19.3f, 37.48f);//1.4 |
||||
Vector3 p4 = new Vector3(-17.47f, -21.1f, 42.42f);//1.7 |
||||
//换算最终位置 |
||||
//-4地面高度-17.7f |
||||
float y = -17.7f; |
||||
var pos = new Vector3((float)data.xAxis, y, (float)data.zAxis); |
||||
if (data.stations.Contains(St3) && !data.stations.Contains(St2)) |
||||
{ //-5地面高度-21.1f |
||||
pos.y = -21.1f; |
||||
} |
||||
else if (data.stations.Contains(St1) && data.stations.Contains(St2)) |
||||
{ //-4到-5楼梯上半段 |
||||
pos.y = SetY(pos); |
||||
} |
||||
else if (data.stations.Contains(St2) && data.stations.Contains(St3)) |
||||
{ //-4到-5楼梯下半段 |
||||
pos.y = SetY(pos); |
||||
} |
||||
else if (data.stations.Contains(St2) && !data.stations.Contains(St1) && !data.stations.Contains(St3)) |
||||
{ |
||||
//-4到-5楼梯间过度 |
||||
pos.y = -19.3f; |
||||
} |
||||
|
||||
return pos; |
||||
} |
||||
/// <summary> |
||||
/// 确保角色始终在地面上 |
||||
/// </summary> |
||||
/// <param name="position"></param> |
||||
/// <returns></returns> |
||||
public float SetY(Vector3 position) |
||||
{ |
||||
RaycastHit hit; |
||||
|
||||
var hitlist = Physics.RaycastAll(position, Vector3.down, 100f, ~(1 << (LayerMask.NameToLayer("Defaut") | LayerMask.NameToLayer("Hidden")))); |
||||
if (hitlist.Length > 0) |
||||
{ |
||||
foreach (var item in hitlist) |
||||
{ |
||||
if (item.transform.gameObject.layer == LayerMask.NameToLayer("Stair")) |
||||
return item.point.y; |
||||
} |
||||
} |
||||
|
||||
if (Physics.Raycast(position, Vector3.down, out hit, 100f, 15)) |
||||
{ |
||||
// 如果射线击中地面,设置Y轴为地面高度 |
||||
return hit.point.y; |
||||
} |
||||
return 0f; |
||||
} |
||||
} |
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 9eb03895b8354fe40ade44f0c4c7c7ea |
||||
MonoImporter: |
||||
externalObjects: {} |
||||
serializedVersion: 2 |
||||
defaultReferences: [] |
||||
executionOrder: 0 |
||||
icon: {instanceID: 0} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2 |
||||
guid: 0f5285374fc29a041af3d80b47ad201b |
||||
PrefabImporter: |
||||
externalObjects: {} |
||||
userData: |
||||
assetBundleName: |
||||
assetBundleVariant: |
Loading…
Reference in new issue