using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerDir : MonoBehaviour
{
public GameObject effect_click_prefab;
public Vector3 targetPoisition = Vector3.zero;
private PlayerMove playerMove;
private bool isMoving = false;//表示鼠标是否按下
private void Start()
{
targetPoisition = transform.position;
playerMove = GetComponent<PlayerMove>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//将鼠标点击的点转化为射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//保存碰撞信息
RaycastHit hitInfo;
//使用射线检测表示是否碰撞到什么东西
bool isCollider = Physics.Raycast(ray, out hitInfo);
//记得将地面标签设置为ground
if (isCollider && hitInfo.collider.tag == Tags.ground)
{
isMoving = true;
ShowClickEffect(hitInfo.point);
//未移动时 点击立马朝向目标位置转向
LookAtTarget(hitInfo.point);
}
}
if(Input.GetMouseButtonUp(0))
{
isMoving = false;
}
//移动过程中一点击就会立马朝向目标位置
if (isMoving)
{
//得到要移动的目标位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//保存碰撞信息
RaycastHit hitInfo;
//使用射线检测表示是否碰撞到什么东西
bool isCollider = Physics.Raycast(ray, out hitInfo);
if (isCollider && hitInfo.collider.tag == Tags.ground)
{
LookAtTarget(hitInfo.point);
}
}
else
{
//鼠标抬起后 根据是否移动判断方向
//当在移动过程中 人物一直更新朝向(解决因为碰撞导致的人物方向不一致的问题 朝向改变将会一直走)
if (playerMove.isMoving)
{
LookAtTarget(targetPoisition);
}
}
}
//实例化出来点击的效果
void ShowClickEffect(Vector3 hitPoint)
{
//将点击的位置向上提高0.1 将点击特效显示
hitPoint = new Vector3(hitPoint.x, hitPoint.y+0.1f, hitPoint.z);
GameObject.Instantiate(effect_click_prefab,hitPoint,Quaternion.identity);
}
//主角朝向目标位置的方法
void LookAtTarget(Vector3 hitPoint)
{
targetPoisition = hitPoint;
//只在y轴旋转
targetPoisition = new Vector3(targetPoisition.x,transform.position.y, targetPoisition.z);
this.transform.LookAt(targetPoisition);
}
}
上方这段代码用于鼠标点击更改人物朝向问题
挂载在人物物体上 注意将点击特效赋值和点击的地面的tag标签设置为ground
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum ControlWalkState
{
Moving,
Idle
}
public class PlayerMove : MonoBehaviour
{
public float speed = 4;
public ControlWalkState state = ControlWalkState.Idle;
public bool isMoving = false;//更新朝向
private PlayerDir dir;
private CharacterController controller;
void Start()
{
dir = this.GetComponent<PlayerDir>();
controller = this.GetComponent<CharacterController>();
}
// Update is called once per frame
void Update()
{
float distance = Vector3.Distance(dir.targetPoisition, transform.position);
if (distance > 0.3f)
{
isMoving = true;
state = ControlWalkState.Moving;
//CharacterController中的方法
controller.SimpleMove(transform.forward * speed);
}
else
{
isMoving = false;
state = ControlWalkState.Idle;
}
}
//主角移向目标位置
public void SimpleMove(Vector3 targetPos)
{
transform.LookAt(targetPos);
controller.SimpleMove(transform.forward * speed);
}
}
此段代码用于控制人物移动的效果 也将其挂载在主角物体身上 注意在人物物体上挂载CharacterController组件 并设置其参数将人物主角包裹