您的位置:首页 > 移动开发 > Unity3D

Unity中鼠标点击地面控制人物移动

2014-01-08 21:15 1011 查看
代码实现了鼠标点击控制人物移动的功能,人物会朝向鼠标点击的目标点走去,双击鼠标为跑动。以后还会再添加鼠标点击时的提示效果。
/// <summary>
/// 摄像机对象
/// </summary>
public Camera _camPlayer;
/// <summary>
/// 玩家的变换组件
/// </summary>
public Transform _transPlayer;
/// <summary>
/// 鼠标发出的射线
/// </summary>
private Ray _rayMouseMove;
/// <summary>
/// 射线起点与平面交点的距离
/// </summary>
private float _fDistMouseMove;
/// <summary>
/// 玩家所在的平面
/// </summary>
private Plane _planePlayer;
/// <summary>
/// 鼠标点击的三维坐标点
/// </summary>
private Vector3 _vec3Target;
/// <summary>
/// 鼠标点击的时间间隔
/// </summary>
private float _fTime = 0f;
/// <summary>
/// 玩家的角色控制器组件
/// </summary>
private CharacterController _playerControl;
/// <summary>
/// 玩家的动画组件
/// </summary>
private Animation _aniPlayer;
/// <summary>
/// 玩家的状态
/// </summary>
private int _playerStatus = 0;
private Vector3 _vec3;
//玩家的状态
private const int PLAYER_IDLE = 0;
private const int PLAYER_WALK = 1;
private const int PLAYER_RUN = 2;
void Awake()
{
_playerControl = (CharacterController)GameObject.FindObjectOfType(typeof(CharacterController));
_aniPlayer = GameObject.FindGameObjectWithTag("Player").GetComponent<Animation>();
_planePlayer = new Plane(_transPlayer.up, _transPlayer.position);
_vec3Target = _transPlayer.position;
//初始设置玩家的状态
SetPlayerStatus(PLAYER_IDLE);
}

void Update()
{
if (Input.GetMouseButtonDown(0)) {
//发射检测射线
_rayMouseMove = _camPlayer.ScreenPointToRay(Input.mousePosition);
//利用玩家平面,返回射线起点与平面交点的距离
_planePlayer.Raycast(_rayMouseMove, out _fDistMouseMove);
//根据距离获得鼠标点击的目标点三维坐标
_vec3Target = _rayMouseMove.GetPoint(_fDistMouseMove);
//玩家朝向目标点
_transPlayer.LookAt(new Vector3(_vec3Target.x, _transPlayer.position.y, _vec3Target.z));
//如果鼠标点击的时间间隔小于0.2秒,设定跑的状态
if (Time.realtimeSinceStartup - _fTime <= 0.2f) {
SetPlayerStatus(PLAYER_RUN);
} else {//反之,设定走的状态
SetPlayerStatus(PLAYER_WALK);
}
//保存鼠标点击时间
_fTime = Time.realtimeSinceStartup;
}
}

void FixedUpdate()
{
switch (_playerStatus) {
case PLAYER_IDLE:
//不移动
break;
case PLAYER_WALK:
PlayerMove(0.05f);
break;
case PLAYER_RUN:
PlayerMove(0.1f);
break;
default:
break;
}
}

/// <summary>
/// 设置玩家状态的方法
/// </summary>
/// <param name="status">状态编号</param>
void SetPlayerStatus(int status)
{
switch (status) {
case PLAYER_IDLE:
_aniPlayer.Play("idle");
break;
case PLAYER_WALK:
_aniPlayer.Play("walk");
break;
case PLAYER_RUN:
_aniPlayer.Play("run");
break;
default:
break;
}

_playerStatus = status;
}

/// <summary>
/// 玩家移动的方法
/// </summary>
/// <param name="speed">移动速度</param>
void PlayerMove(float speed)
{
if (Mathf.Abs(Vector3.Distance(_transPlayer.position, _vec3Target)) >= 0.1f) {
_vec3 = Vector3.ClampMagnitude(_vec3Target - _transPlayer.position, speed);
_playerControl.Move(_vec3);
} else {
SetPlayerStatus(PLAYER_IDLE);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: