在上一节我们讲了实现系统自身提供的模型的移动和旋转,但是实际的项目中系统自身的模型肯定满足不了策划的需求,所以说这个时候就需要使用美术为我们提供的精美的模型和动画,那下面就让我们一起来学习Unity3D中模型的导入和动画的播放。
首先下载一个需要导入一个带有动画的模型,这里一般都是有美术提供,我这里下载了一个僵尸模型:
首先把导入的模型,拖拽到场景中,然后将其放到场景中适当的位置,上一节我们讲过如何让相机跟随物体移动,这次同样将Smooth Follow拖拽到僵尸身上,调整相应的参数。在场景中的僵尸模型上有一个Animation组件,下面我们来了解下他的含义:
Animation
idle 该模型默认动画名称为idle
Animations
size 该模型动画的数量
Element 该模型的动画名称
Play Automatically 是否自动播放
Animation Physics 是否设置该模型物理碰撞
Animation Only if Visable 是否设置该模型仅自己显示
在这里为防止模型穿墙,我们要为模型添加Rigidbody刚体组件和Capsule Collider碰撞器。
下面我们创建一个脚本命名为FbxMove.cs,用来实现播放动画和通过鼠标点击让角色移动到鼠标点击位置,将其挂到僵尸模型的身上。
首先来获取模型身上的Animation组件:
void Start()
{
//获取僵尸身上的动画组件
mAnimation = transform.GetComponent<Animation>();
}
然后将你要显示的目标指示图片拖拽到指定的TargetPoint上。
下面我们介绍如何获取鼠标点击位置,下面是代码:
void Update()
{
//当点击鼠标左键
if (Input.GetMouseButton(0))
{
//获取从主相机发出的一条射线
mRay = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(mRay, out mHit))
{
//当碰撞到Terrain使获取到当时的位置
if (mHit.collider.gameObject.name == "MyTerrain")
{
mTargetPos = mHit.point;
//让角色看向要移动的位置
transform.LookAt(new Vector3(mTargetPos.x, mTargetPos.y, mTargetPos.z));
isCanAutoMove = true;
//在鼠标点击的位置,显示红色标记
TargetPoint.transform.localPosition = mTargetPos+new Vector3(0,0.1f,0);
}
}
}
}
这里主要用到了射线检测,下面我说一下原理,射线主要就是通过相机发出一条射线到你点击的位置,当射线碰撞到你要检测的物体的时候,就会返回一个bool值,这个时候就可以获取到摄像碰撞到Terrain的位置。
这个时候已经获取到想要到达的位置,下面我们就来让僵尸播放动画同时移动到鼠标指示的位置:
if (isCanAutoMove)
{
//播放步行动画
mAnimation.Play("walk");
//开始向指定方向移动
transform.Translate(Vector3.forward * Speed * Time.deltaTime);
//计算和目标位置的距离
float targetDist = Vector3.Distance(mTargetPos, transform.position);
//当两者的距离小于1,停止移动
if (targetDist <= 0.1f)
{
//将红色标记移到屏幕之外
TargetPoint.transform.localPosition = new Vector3(0, -100f, 0);
//播放idle动画,等待指令
mAnimation.Play("idle");
isCanAutoMove = false;
}
}
这里我们在说一下如何播放动画,我们看到在Animation组件中总共有15个动画,但这里我们主要用到两个动画,idle和walk,我们获取到动画组件之后,主要是通过 mAnimation.Play("idle")这句话来实现动画的播放,就是通过Play,然后传入动画的名字,就可以了。
这里是完整脚本:
using UnityEngine;
using System.Collections;
public class FbxMove : MonoBehaviour
{
public GameObject TargetPoint; //移动的目的地红色标记
private float Speed = 2; //移动速度
private Ray mRay;
private RaycastHit mHit;
private bool isCanAutoMove; //是否开始移动的标志位
private Vector3 mTargetPos; //要移动的目标位置
private Animation mAnimation; //动画组件
void Start()
{
//获取僵尸身上的动画组件
mAnimation = transform.GetComponent<Animation>();
}
void Update()
{
//当点击鼠标左键
if (Input.GetMouseButton(0))
{
//获取从主相机发出的一条射线
mRay = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(mRay, out mHit))
{
//当碰撞到Terrain使获取到当时的位置
if (mHit.collider.gameObject.name == "MyTerrain")
{
mTargetPos = mHit.point;
//让角色看向要移动的位置
transform.LookAt(new Vector3(mTargetPos.x, mTargetPos.y, mTargetPos.z));
isCanAutoMove = true;
//在鼠标点击的位置,显示红色标记
TargetPoint.transform.localPosition = mTargetPos+new Vector3(0,0.1f,0);
}
}
}
if (isCanAutoMove)
{
//播放步行动画
mAnimation.Play("walk");
//开始向指定方向移动
transform.Translate(Vector3.forward * Speed * Time.deltaTime);
//计算和目标位置的距离
float targetDist = Vector3.Distance(mTargetPos, transform.position);
//当两者的距离小于1,停止移动
if (targetDist <= 0.1f)
{
//将红色标记一道屏幕之外
TargetPoint.transform.localPosition = new Vector3(0, -100f, 0);
//播放idle动画,等待指令
mAnimation.Play("idle");
isCanAutoMove = false;
}
}
}
}
这时候点击运行就可以通过鼠标点击控制僵尸到处移动了。
下面附上工程地址:
链接:http://pan.baidu.com/s/1mi007Mg 密码:mjeb
想了解更多,可以关注下方公众号,添加QQ群:879354767关注有福利哦!