本文章僅僅用於個人記錄。
需求:鼠標按下,獲取鼠標按下後的移動向量。
1、用於記錄鼠標的移動向量,camDela。
2、用於記錄鼠標按下的初始位置,startPos。
if 鼠標按下
判斷位置 startPos是否爲初始位置,如果是,設置startPos值,否則設置camDela值 = 按下位置-startPos
if 鼠標鬆開
camDela和startPos初始化。
using UnityEngine;
using System.Collections;
public class CalDirection : MonoBehaviour
{
public static Vector3 camDela;
private Vector3 startPos = Vector3.zero;
// Use this for initialization
void Start()
{
camDela = Vector3.left;
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButton(0))
{
if (startPos == Vector3.zero)
{
startPos = Input.mousePosition;
}
else
{
camDela = Input.mousePosition - startPos;
}
}else if (Input.GetMouseButtonUp(0))
{
camDela = Vector3.left;
startPos = Vector3.zero;
}
}
}
利用獲取到的鼠標位置向量,進行模型的移動,模型使用的碰撞檢測體爲 character collider。
將模型的y軸(up)映射到世界座標系的xz面,將模型的x(right)軸映射到世界座標系的xz面,
根據全局static 變量 camDela,來獲取到該向量在xz軸上的投影,其中包含,camDela 的x軸和y軸,然後根據獲得的投影向量進行移動。然後分別計算映射後的向量並相加,最後移動。
其中motion.y-=1000,用於將模型緊貼地面。
public class Move : MonoBehaviour
{
private CharacterController cc;
// Use this for initialization
void Start()
{
cc = GetComponent<CharacterController>();
}
// Update is called once per frame
void Update()
{
Debug.Log(CalDirection.camDela);
if(CalDirection.camDela == Vector3.left)
{
return;
}
Vector3 WorldYDirection = Camera.main.transform.TransformDirection(Vector3.up);
Vector3 GrandYDirection = new Vector3(WorldYDirection.x, 0, WorldYDirection.z).normalized * CalDirection.camDela.y;
Vector3 WorldXDirection = Camera.main.transform.TransformDirection(Vector3.right);
Vector3 GrandXDirection = new Vector3(WorldXDirection.x, 0, WorldXDirection.z).normalized * CalDirection.camDela.x;
Vector3 direction = (GrandYDirection + GrandXDirection).normalized;
Vector3 motion = direction * Time.deltaTime;
motion.y -= 1000;
cc.Move(motion);
}
}