這是我第一次在這里發帖。我正在使用新的 Unity 多人網路解決方案開發游戲。總之,問題在于玩家沒有按預期移動。
我正在嘗試按如下方式獲取玩家輸入:
Vector3 worldSpaceDir = new Vector3(Input.GetAxisRaw("Vertical"), 0, Input.GetAxisRaw("Horizontal"));
然后將其轉換為玩家角色的物件空間坐標:
_inputDirection = transform.InverseTransformDirection(worldSpaceDir);
我遇到的問題是旋轉 0 或 180 時,玩家使用 WASD 輸入按預期移動,但是,在 90 或 270 時,所有輸入都被翻轉(A = 右,D = 左,W = 向后,S =向前)。
我發現一個問題正是我的問題,但沒有人回答。這個問題現在已經很老了,所以我想再次詢問它以獲得更多可見性。
這是原始問題的鏈接。
uj5u.com熱心網友回復:
首先,你worldSpaceDir走錯了,應該如下
Vector3 worldSpaceDir = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
這里我們將水平輸入作為 X,垂直輸入作為 Z,因為在 Unity 中 Forward 指向的是 Z 而不是 Y。
其次,我們不需要使用InverseTransformDirection()我們只需要TransformDirection()像下面這樣的東西
Vector3 inputDirection = transform.TransformDirection(worldSpaceDir);
在這里,我們告訴 unity 將worldSpaceDir相對于transform(區域方向)的方向轉換為世界空間方向,因此我們實際上可能會給worldSpaceDir.
以下內容對您有用。
private void Update() {
Move();
}
private void Move() {
Vector3 directionToMove = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
Vector3 inputDirection = transform.TransformDirection(directionToMove);
transform.position = inputDirection * Time.deltaTime;
}
uj5u.com熱心網友回復:
我想你實際上想反其道而行之!
Transform.InverseTransformDirection將向量從世界空間轉換為區域空間。
但是,您得到的輸入是XZ 平面上的區域向量。您想根據您的播放器物件方向應用此方向,例如,如果按下右(您的輸入是1,0,0),物件將向其transform.right矢量移動。
所以你寧愿想反方向轉換成世界空間來移動Unity世界空間中的物體。
你應該使用Transform.TransformDirection!
var worldMove = transform.TransformDirection(input);
或者,您也可以乘以旋轉,例如
var worldMove = transform.rotation * input;
請注意,如果您還使用像您鏈接的問題一樣的剛體,那么它也Rigidbody.AddRelativeForce基本上以相同的方式作業,并期望一個區域空間矢量,然后在內部轉換為世界空間力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/448003.html
