Unity 鼠标点击控制玩家角色移动

1.首先创建一个角色
如果有动画就添加上动画组件
设置刚体、碰撞体等一系列需要的组件(看自身需求)

2.然后创建一个plane做地板(记得地板也要添加碰撞体,不然人物会一直下落)

3.然后添加一个脚本PlayerMove挂载到玩家角色身上

脚本思路:
1.通过射线检测,判断点击的是地板还是敌人或是己方队友
2.移动,若是敌人就判断是否在攻击距离内,若不在就移动到攻击距离,然后开始攻击,若果队友或者是地板就直接移动到 目标点
3.目标点与自身的位置关系,是否要转身、距离等
4.停止,由于float类型有误差的关系,所以当距离小于一定值得时候,就判定为到达目标点

代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    //移动速度
    private float speed = 3f;
    //动画
    private Animator ani;

    //射线碰撞检测
    private RaycastHit hit;
    //射线
    private Ray ray;
    //鼠标点击位置
    private Vector3 endPosition;

    Vector3 step;
    Quaternion ratation;

    private void Awake()
    {
        //获取动画组件
        ani = GetComponent<Animator>();
    }

    void Update()
    {
        //如果按下鼠标右键(0是左键、1是右键)
        if (Input.GetMouseButtonDown(1))
        {
            //向鼠标点击的位置发射射线
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //如果射线碰到物体
            if (Physics.Raycast(ray, out hit))
            {
                //如果是地板就行走,如果是友军就走过去,如果是敌人就走过去并攻击
                if (hit.transform.tag == "Enemy")
                {
                    //攻击
                    //Attack();
                    Debug.Log("攻击");
                }
                else
                {
                    //如果不是敌人
                    //赋值目标点
                    endPosition = hit.point;
                    //移动过程中y轴保持不变
                    endPosition.y = transform.position.y;
                    //方向向量
                    step = endPosition - transform.position;
                    ratation = Quaternion.LookRotation(step);
                }
            }
            //播放动画
            ani.SetBool("Move", true);
        }

        Move();
        Stop();
    }

    //移动
    public void Move()
    {
        //移动
        //方向向量!=(0,0,0)才能说明有地方可以去,不然就是点自己脚底板了
        if (step != Vector3.zero)
        {
            //转身
            transform.rotation = Quaternion.Lerp(transform.rotation, ratation, 0.2f);
            //移动过去
            transform.Translate(transform.forward * speed * Time.deltaTime, Space.World);
        }
    }

    //停止移动
    public void Stop()
    {
        //计算自身和目标点的距离
        float distance = Vector3.Distance(transform.position, endPosition);
        //判断和目标点的距离是否小于0.1f
        if (distance < 1f)
        {
            //如果小于就判定到达目的地,执行待机
            step = Vector3.zero;
            //停止播放动画
            ani.SetBool("Move", false);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值