欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。
现在的大部分mmo游戏都有了自动寻路功能。点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。使用Unity来开发手游,自动寻路可以有很多种实现方式。
我们要实现一个功能:点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上”最短路径“。
1、创建地形
2、添加角色
3、创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。
4、选中地形,在Navigation窗口中,设置Navigation Static
5、依次选中障碍物,在avigation窗口中,设置Navigation Static
6、Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进程场景烘焙,就可以烘焙出寻路网格了
7、为角色添加NavMeshAgent组件。Component->Navigation->Nav Mesh Agent
8、为角色新增一个脚本PlayerController.cs,实现点击目标,自动寻路功能
代码:
private NavMeshAgent agent;
private Animator anim;
void Start() {
agent = GetComponent<NavMeshAgent>();
anim = GetComponent<Animator>();
}
void Update() {
RaycastHit hit;
if (Input.GetMouseButtonDown(0)) {
Ray ray =Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)){
agent.SetDestination(hit.point);
}
private Animator anim;
void Start() {
agent = GetComponent<NavMeshAgent>();
anim = GetComponent<Animator>();
}
void Update() {
RaycastHit hit;
if (Input.GetMouseButtonDown(0)) {
Ray ray =Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)){
agent.SetDestination(hit.point);
}
}
if (agent.remainingDistance == 0){
AnimationToIdle();
}
else{
AnimationToWalk();
}
}
public void AnimationToIdle(){
anim.SetFloat("idle", 1F);
anim.SetFloat("walk", 0.0F);
anim.SetFloat("run", 0F);
}
AnimationToIdle();
}
else{
AnimationToWalk();
}
}
public void AnimationToIdle(){
anim.SetFloat("idle", 1F);
anim.SetFloat("walk", 0.0F);
anim.SetFloat("run", 0F);
}
public void AnimationToWalk(){
anim.SetFloat("run", 0.0F);
anim.SetFloat("idle", 0F);
anim.SetFloat("walk", 1.0F);
}
anim.SetFloat("run", 0.0F);
anim.SetFloat("idle", 0F);
anim.SetFloat("walk", 1.0F);
}
宠物跟随
public Transform target;
private NavMeshAgent agent;
void Start () {
agent = GetComponent<NavMeshAgent>();
}
void Update () {
if (target!= null) {
agent.destination=target.position;
}
}
把脚本给宠物,为宠物添加NavMeshAgent,target为巨魔
private NavMeshAgent agent;
void Start () {
agent = GetComponent<NavMeshAgent>();
}
void Update () {
if (target!= null) {
agent.destination=target.position;
}
}
把脚本给宠物,为宠物添加NavMeshAgent,target为巨魔