成都东呈模型-Unity3D游戏场景之FBX模型的载入与动画的播放和鼠标控制模型移动

Unity3D游戏场景之FBX模型的载入与动画的播放和鼠标控制模型移动

时间:2018年04月01日 12:28   编辑:爱开发

关键技术,第一时间送达


很多实际的项目中系统自身的模型肯定满足不了策划的需求,所以说这个时候就需要使用美术为我们提供的精美的模型和动画,那下面就让我们一起来学习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();

    }

然后将你要显示的目标指示图片拖拽到指定的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; //要移动的目标位置

<p style="margin-top: 0px; margin-bottom: 0px; padding: 0px 1em; max-width: 100%; clear: both; min-height: 1em; color: rgb(51, 51, 51); font-family: -apple-sys