用鼠标控制角色移动


      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");
            }
        }
	}
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值