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