2017-08-07 35 views
2

我不太確定我是否爲該問題選擇正確的標題,隨意編輯它如果您發現它具有誤導性。將方向應用到當前變換位置

我正在開發一個涉及音樂作爲遊戲玩法核心的動作遊戲。它包含一組移動到幾個方向的實體(遊戲對象);頂部,右側,左側,底部和對角線移動(例如:左上角,右上角,左下角等)。

要確定這些實體的位置,需要計算一個涉及音樂節奏和實體本身的幾個屬性的值,我可以在Unity中生成它。

我用下面的函數來確定的變換實體的位置:

private Vector3 _position; 

    private void DeterminePosition(float offset) 
    { 
     // In actual code, the _position is initialized under Start() method 
     // But for this simplification sake, I'll just put it here 
     _position = _position == null ? new Vector3(0, 0, 1f) : _position; 

     if (Direction == Direction.Up || Direction == Direction.RightUp || Direction == Direction.LeftUp) 
     { 
      _position.y = offset; 
     } 
     if (Direction == Direction.Down || Direction == Direction.RightDown || Direction == Direction.LeftDown) 
     { 
      _position.y = -offset; 
     } 
     if (Direction == Direction.Left || Direction == Direction.LeftDown || Direction == Direction.LeftUp) 
     { 
      _position.x = -offset; 
     } 
     if (Direction == Direction.Right || Direction == Direction.RightDown || Direction == Direction.RightUp) 
     { 
      _position.x = offset; 
     } 

     transform.position = _position; 
    } 

offset的是,我在談論前的值。

該代碼的工作原理完美,但遊戲需要改變。 而不是固定方向(例如:向上,向右,向左,向下,向右向上,向左向下等),我們決定使用度數值作爲方向(0到360度)。

現在我不知道如何去阻止這件事。我試過使用下面的代碼,但它不起作用:

_position = new Vector3(offset, offset, transform.position.z); 

    // Where the direction is between 0 .. 360 
    transform.position = Quaternion.Euler(0, direction, 0) * _position; 

其他人能想出解決方案嗎?
在此先感謝!

回答

2

如果offset表示從新位置向(0, 0, transform.position.z)的距離(調用該原點,因爲只有xy位置似乎來改變),並direction在正x軸和從矢量之間度逆時針測量的角原點到新的位置,你可以使用directionoffsetCOS得到新xy的位置:

_position.x = offset * Mathf.Cos(Mathf.Deg2Rad * direction); 
_position.y = offset * Mathf.Sin(Mathf.Deg2Rad * direction); 
_position.z = transform.position.z; //assuming the z position stays the same 
transform.position = _position; 

編輯

要佔比例,我想你會需要根據direction更換offset

float multiplier = 0f; 
if(0 <= direction && direction <= 45) 
{ 
    multiplier = Mathf.Abs(offset/Mathf.Cos(Mathf.Deg2Rad * direction)); 
} 
else if(45 < direction && direction <= direction <= 135) 
{ 
    multiplier = Mathf.Abs(offset/Mathf.Sin(Mathf.Deg2Rad * direction)); 
} 
else if(135 < direction && direction <=225) 
{ 
    multiplier = Mathf.Abs(offset/Mathf.Cos(Mathf.Deg2Rad * direction)); 
} 
else if(225 < direction && direction <= 315) 
{ 
    multiplier = Mathf.Abs(offset/Mathf.Sin(Mathf.Deg2Rad * direction)); 
} 
else if(315 < direction && direction <= 360) 
{ 
    multiplier = Mathf.Abs(offset/Mathf.Cos(Mathf.Deg2Rad * direction)); 
} 

_position.x = multiplier * Mathf.Cos(Mathf.Deg2Rad * direction); 
_position.y = multiplier * Mathf.Sin(Mathf.Deg2Rad * direction); 
_position.z = transform.position.z; 
transform.position = _position; 

這將打破座標平面分成4 90度部分(如果你把315 < direction <= 3600 <= direction < 45),您正在使用COS的direction創建應占地區事半功倍其中offset需要根據位移的xy分量進行縮放。

+0

謝謝你的回答,這幾乎是正確的(它確實有效,但是..)我忘了提及遊戲競技場的形狀是方形而不是圓形。在我之前使用度的實現中,當實體進入角落(頂點,頂點等)時,變換位置與速度匹配(當音樂偏移量達到0時,實體撞擊到舞臺的邊界)。但是,當我更新與實施,實體似乎有點慢,音樂偏移量達到0,但實體甚至沒有擊中競技場的邊界。它有點將舞臺轉變爲圓形而不是方形。 – SirusDoma

+0

但是,如果實體向前移動,則變換位置和音樂偏移似乎是匹配的(例如方向爲180度) – SirusDoma

+0

以下圖片描述發生了什麼:http://imgur.com/e780D88或此:http: //imgur.com/tmLY4Pt – SirusDoma