Unity实现点击地面控制人物移动

来源:互联网 发布:java swing编程 编辑:程序博客网 时间:2024/04/30 08:34

首先声明,博主使用的是Unity5.3.2(64)

最近几篇关于Unity的博客是博主学习了一个RPG游戏后把一部分功能摘出来做的一个总结,这篇是关于人物移动的。


废话不多说:

using UnityEngine;using System.Collections;public class PlayerDirection : MonoBehaviour {    public Vector3 targetPosition = Vector3.zero;//用来保存目标位置    private bool isMoving = false;//用来判断是否鼠标移动    private PlayerMove move;//用来执行移动的脚本    // Use this for initialization    void Start () {        targetPosition = transform.position;//初始化目标位置        move = GetComponent<PlayerMove> ();//获取人物的移动脚本    }    // Update is called once per frame    void Update () {        if (Input.GetMouseButtonDown (0)) {            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);//从相机向鼠标点击点发射条射线            RaycastHit hit;//记录碰撞信息            bool isCollider = Physics.Raycast (ray,out hit);//判断是否发生碰撞            if (isCollider && hit.collider.tag == Tags.ground) {//f发生碰撞,并且是地面                isMoving = true;                LookAtTarget (hit.point);//使物体朝向目标点            }        }        if (Input.GetMouseButtonUp (0)) {            isMoving = false;        }        if (isMoving) {            //得到要移动的目标位置            //让主角朝向目标位置            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);            RaycastHit hit;            bool isCollider = Physics.Raycast (ray, out hit);            if (isCollider && hit.collider.tag == Tags.ground) {                LookAtTarget (hit.point);            }        } else {            if (move.isMove) {                LookAtTarget (targetPosition);            }        }    }    void LookAtTarget(Vector3 hitPoint){         targetPosition = hitPoint;        targetPosition = new Vector3(targetPosition.x,transform.position.y,targetPosition.z);        this.transform.LookAt (targetPosition);    }}
using UnityEngine;using System.Collections;public class PlayerMove : MonoBehaviour {    public float speed = 4;//移动速度    public bool isMove = false;//判读是否在移动中    private PlayerDirection dir;//用来实现点击地面的脚本    private CharacterController controller;//角色控制器    // Use this for initialization    void Start () {        dir = GetComponent<PlayerDirection> ();        controller = GetComponent<CharacterController> ();    }    // Update is called once per frame    void Update () {    //获得与目标点的距离            float distance = Vector3.Distance (dir.targetPosition, transform.position);            //距目标点的距离大于0.2才移动            if (distance > 0.2f) {                isMove = true;                controller.SimpleMove (transform.forward * speed);            } else {                isMove = false;            }        }    }    public void SimpleMove(Vector3 targetPos){        transform.LookAt (targetPos);//朝向目标点        controller.SimpleMove (transform.forward * speed);//移动    }}
0 0