代碼內容
public class Mouse : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
AGF();
}
/// <summary>
/// 跟隨鼠標移動並旋轉
/// </summary>
public void AGF()
{
//點擊鼠標右鍵獲取信息
if (Input.GetMouseButton(1))
{
//1獲得鼠標點擊屏幕的二維坐標
Vector3 mouse = Input.mousePosition;
//2創建一個射線 從相機位置到鼠標點擊的位置的方向上
Ray ray = Camera.main.ScreenPointToRay(mouse);
//定義一個射線檢測的保存對象
RaycastHit hit;//hit保存射線發射后碰撞的信息
//開始碰撞檢測,射線檢測返回一個bool類型,true:有碰撞,false:無碰撞
if (Physics.Raycast(ray, out hit, 100f)) //碰撞檢測(射線,碰撞結果給hit,射線的長度100米)
{
//獲取坐標信息
print(hit.point);
target= new Vector3(hit.point.x, 2f, hit.point.z);
//獲取旋轉信息
Vector3 dir = target - rotatepos.transform.position;
Quaternion lookRotation = Quaternion.LookRotation(dir);
rotation = Quaternion.Lerp(rotatepos.transform.rotation, lookRotation, 2).eulerAngles;
}
}
//判斷是否有信息 有就執行
else if (target!=null)
{
//判斷目標旋轉值和自己旋轉值是否一致 不一致就執行
if (rotation.y != rotatepos.transform.localEulerAngles.y)
{
float value = Mathf.MoveTowards(rotatepos.transform.localEulerAngles.y, rotation.y, 3);
rotatepos.transform.rotation = Quaternion.Euler(Zvalue, value, 0f);
}
print(rotation.y);
print(rotatepos.transform.localEulerAngles.y);
//移動自己向目標點移動
transform.position = Vector3.MoveTowards(transform.position, target, 0.2f);
}
}
public float Zvalue = 90;
public Vector3 target;
public GameObject rotatepos;
private Vector3 rotation;
}
鼠標跟隨的步驟
獲取鼠標屏幕上的坐標
轉換屏幕坐標成世界坐標
獲取3D坐標
獲取3D旋轉
判斷是否執行信息
執行移動到目標點
執行朝向目標點
其他的就是一些代碼執行順序產生的效果
效果圖
移動目標點
朝向目標點