Navmeshagent与飞行(3)
来源:互联网 发布:淘宝客服面试注意事项 编辑:程序博客网 时间:2024/06/05 19:39
第2的版本上坡的时候没有问题,但下坡的时候就会提前下坡,出现下图的问题:
为了解决这个问题,我们需要从角色自身向下再发射一组射线,用前面的射线和向下发射的射线长度对比来判断是上坡还是下坡。
解决后的效果如下:
修改后的代码如下:
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.AI;public enum MoveType{ Walk, Fly}public class Player : MonoBehaviour { public MoveType _MoveType; public float _Height; private NavMeshAgent agent; private Vector3 desPos; private bool flyBool = false; void Start () { agent = transform.GetComponent<NavMeshAgent>(); if (_MoveType == MoveType.Fly) agent.enabled = false; }void Update () { if (Input.GetMouseButtonDown(0)) { Move(); } if (_MoveType == MoveType.Fly) { RaycastHit hit1; Vector3 direct = transform.GetChild(0).position - transform.GetChild(1).position; if (Physics.Raycast(transform.GetChild(1).position, direct, out hit1)) { RaycastHit hit2; if (Physics.Raycast(transform.position, -transform.up, out hit2)) { if (hit1.collider.tag != "Player" && hit2.collider.tag != "Player") { if (Vector3.Distance(transform.position, hit1.point) > Vector3.Distance(transform.position, hit2.point)) { //表示从高的地方走向了低的地方 Vector3 newpos = new Vector3(transform.position.x, hit2.point.y + _Height, transform.position.z); transform.position = Vector3.MoveTowards(transform.position, newpos, Time.deltaTime * 20); } else { Vector3 newpos = new Vector3(transform.position.x, hit1.point.y + _Height, transform.position.z); transform.position = Vector3.MoveTowards(transform.position, newpos, Time.deltaTime * 20); } } } } if (flyBool) { transform.position = Vector3.MoveTowards(transform.position, desPos, Time.deltaTime *5); if (Vector3.Distance(transform.position, desPos) < _Height + 0.1f) { flyBool = false; } } } } void Move() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//在鼠标所在的屏幕位置发出一条射线 RaycastHit hit; if (Physics.Raycast(ray.origin, ray.direction, out hit)) { if (hit.collider.gameObject.tag == "Terrain") {//设置地形Tag为Terrain switch (_MoveType) { case MoveType.Walk: agent.SetDestination(hit.point); break; case MoveType.Fly: transform.LookAt(new Vector3(hit.point.x, transform.position.y, hit.point.z)); desPos = hit.point; flyBool = true; break; } } } }}
阅读全文
0 0
- Navmeshagent与飞行(3)
- Unity Navmeshagent与飞行
- Navmeshagent与飞行(2)
- NavMeshAgent
- NavMeshAgent
- NavMeshAgent
- unity5之导航网格寻路系统-3NavMeshAgent(导航网格代理)
- 飞行模式与STK
- 概率与期望 HDU 4405 Aeroplane chess(飞行棋)
- 寻路NavMeshAgent
- 神仙飞行与轻功
- “飞行模式”与“离线模式”
- 飞行
- Android飞行模式的打开与关闭
- 我的游戏开发笔记(六):NavMeshAgent及自动寻径(跳跃)。
- 噩梦系列篇之敌人自动追击Player功能(NavMeshAgent)
- Unity3d NavMeshAgent 路径点寻路
- Unity3D-NavMeshAgent寻路
- Magento适应Seaslog和Logstash要求的书写规范
- ubuntu与windows共享文件夹(samba)
- orcle修改一个表的状态为另一个表中对应的状态
- 求出0~999之间的所有“水仙花数”并输出
- Spring cloud系列九 Hystrix的配置属性优先级和详解
- Navmeshagent与飞行(3)
- 模拟实现strchar函数
- JavaScript 实例:当当网 点击展开效果
- Spring 4.0新特性------Web开发的增强
- 通用组、全局组、本地域组的区别
- nodejs学习笔记-第一课
- C语言实验——打印菱形
- GIS结合BIM技术在数字城市中的应用
- POJ3468 线段树模板