在Unity控制角色移动时,要注意两大点:
- 鼠标点击地面,检测射线以及人物面朝移动方向。
public class PlayerDir : MonoBehaviour {
public GameObject effect_click_prefabs; //鼠标点击的效果
public Vector3 targetPosition = Vector3.zero;//人物位置
private bool isMoving = false;//表示鼠标的是否按下
// 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);
if (isCollider && hitInfo.collider.tag == Tags.ground) {
isMoving = true;
//实例化点击效果
ShowClickEffect(hitInfo.point);
//人物朝向点击方向
LookAtarget(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){
LookAtarget(hitInfo.point);
}
}
}
//实例化点击的效果
public void ShowClickEffect(Vector3 hitPoint) {
hitPoint = new Vector3(hitPoint.x,hitPoint.y + 0.1f,hitPoint.z);
GameObject.Instantiate(effect_click_prefabs, hitPoint, Quaternion.identity);
}
//让人物朝向目标位置
void LookAtarget(Vector3 hitPoint) {
targetPosition = hitPoint;
//人物转向时,X、Z轴是不变的。所以只让其Y轴变化
targetPosition = new Vector3(targetPosition.x, transform.position.y, targetPosition.z);
this.transform.LookAt(targetPosition);
}
}
-
控制人物的移动与速度
首先在人物上挂载一个“Character Controller’”,控制人物移动。并调整大小。
image.png
public class PlayerMove : MonoBehaviour {
public float speed = 3;
private PlayerDir dir;
private CharacterController controller;
void Start () {
dir = this.GetComponent<PlayerDir>();//得到鼠标点击的位置
controller = this.GetComponent<CharacterController>();//得到人物管理者的对象。
}
// Update is called once per frame
void Update () {
//Distance:返回两者之间的距离。
float distance = Vector3.Distance(dir.targetPosition,transform.position);
if (distance >= 0.05f) {
//调用人物管理者的SimpleMove方法,使其移动。里面传入速度和方向。
controller.SimpleMove(transform.forward * speed);
}
}
}
网友评论