Unity3D游戏场景之鼠标点击地面控制人物移动

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu1368072332/article/details/78407027

在上一节我们讲了实现系统自身提供的模型的移动和旋转,但是实际的项目中系统自身的模型肯定满足不了策划的需求,所以说这个时候就需要使用美术为我们提供的精美的模型和动画,那下面就让我们一起来学习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关注有福利哦!

猜你喜欢

转载自blog.csdn.net/yu1368072332/article/details/78407027