1.我们首先创建地形,然后添加一个带有动画的角色模型,博主在这里已经导进unity了并且把角色名称修改为“主角”,当然名称你可以任意修改成自己喜欢的。然后在模型Inspector面板中把Animation Type修改成Generic,这里不建议选Humanoid。然后就可以在Animation面板中,分割动画帧了。
2.我们完成了动画分割以后为角色添加一个Animator Controller,打开控制面板,把刚才分割出来的idle(默认)和walk动画拖到控制器面板中,并且如图连好线。这里的意思是角色一开始时候是idle(默认)状态,后面会用代码触发walk的状态。设置好之后,为角色模型添加Animator组件,并且把刚才做好的Animator Controller(在这里我改成了“角色”)拖到Controller中。
3.这里用到了自动寻径的组件(Navigation),选中添加的地形,然后在Window中打开Navigation面板,勾选Navigation Static,Navigation Area模式为Walkable,按面板下面的Bake进行烘培,烘培好的地形变成了蓝色。同理选中房子啊物体啊什么的障碍物(不能走的地方),Navigation Area模式为Not Walkable进行烘培。在这里博主要重要说明一下,如果地形较大,可能无法进行烘培,所以这时候我们要在Bake面板中,把Agent Radius适当调大才可以。(曾经在这里折腾了半天)。
4.好了一切工作准备完了,我们接下来就可以敲代码了,不多说,自己看注释理解,这里用到了射线碰撞检测。创建一个MouseMove脚本,写好赋予给角色。并且记住为角色添加Character Controller组件和Nav Mesh agent组件。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.UI;
/// <summary>
/// 把脚本赋予给主角
/// </summary>
public class MouseMove : MonoBehaviour
{
private NavMeshAgent agent;
private Animator animator;
void Start ()
{
//获取自动寻路组件
agent = GetComponent<NavMeshAgent>();
//动画组件
animator = 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);
}
}
//如果检测到的距离为0,则播放默认动画,否则走起来
if (agent.remainingDistance == 0)
{
animator.Play("idle");
}else
{
animator.Play("walk");
}
}
}
最终运行效果,想去哪里点哪里,就是那么潇洒。。
二.还有另一种方法不需要寻路组件,代码如下,写好赋予给角色,可别忘了为地形添加Plane标签哦。(转自秦元培博客)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SimpleMove : MonoBehaviour
{
private Vector3 TargetPos;//目标坐标
void Update ()
{
if (Input.GetMouseButtonDown(0))
{
//获取屏幕坐标
Vector3 ScreenPos = Input.mousePosition;
//定义射线
Ray ray = Camera.main.ScreenPointToRay(ScreenPos);
RaycastHit hit;
if (Physics.Raycast(ray,out hit))
{
//判断是否点中地面
if (hit.collider.gameObject.tag == "Plane")
{
//获取目标坐标
TargetPos = hit.point;
//角色面朝目标
transform.LookAt(TargetPos);
transform.gameObject.GetComponent<Animator>().Play("walk");
transform.Translate(Vector3.forward * 0.5f);
}
}
//如果送开左键
if (Input.GetMouseButtonUp(0))
{
transform.gameObject.GetComponent<Animator>().Play("idle");
}
}
}
}