2017-08-03 130 views
2

我從一個小小的自上而下的遊戲開始,並希望在開始遊戲時計算相機變換。Unity讓玩家集中在屏幕上

相機沒有設置爲90度,它應該像70一樣。旋轉它時,我需要計算Z上的差值以使播放器保持在屏幕中間。

public Transform player; // player object 
float offsetY = 30; // distance on y 
float rotationAngleX = 70; // rotation when looking down 

private void Start() 
{ 
    player = Globals.GetPlayerObject().transform; // reference 
    transform.Rotate(rotationAngleX, transform.rotation.y, transform.rotation.z); // rotate the camera down 
    transform.position = new Vector3(player.position.x, player.position.y + offsetY, player.position.z); // move it to the player 
} 

img

所以我需要在這裏計算,有中間的球員呢?它應該始終有效,所以如果我改變y的高度或者將相機旋轉80度或60度,計算也應該起作用。

謝謝!

回答

2

看起來你需要在這裏做一個小三角。 如果相機在70deg而不是90deg,這實際上意味着您的垂直軸和相機的投影中心之間的角度爲(90deg-70deg)。 因爲我們知道,tan(angle) = opposite/adjacent,我們可以圍繞按摩這個公式找來抵消相機在Z.

這給我們留下的東西,如所需要的「對立」距離:offsetZ = offsetY*Mathf.Tan(Mathf.Deg2Rad(90f-70f));
或在您的普遍情況:offsetZ = offsetY*Mathf.Tan(Mathf.Deg2Rad*(90f-rotationAngleX));

因此,如果您將相機移回偏移量,則播放器將居中。 下面的漂亮MS Paint圖片應該說明一下。

transform.position = new Vector3(player.position.x, player.position.y + offsetY, player.position.z - offsetZ); 

Trigonometry Visualized

+0

嘿,這看起來不錯。 當寫'float offsetZ = offsetY * Mathf.Tan(Mathf.Deg2Rad(90f - rotationAngleX));'編譯器說,'Mathf.Deg2Rad'不能像方法一樣使用。 這是一個值。所以我試着寫 'float offsetZ = offsetY * Mathf.Tan(Mathf.Deg2Rad *(90f - rotationAngleX));' 但是這並不起作用,玩家停留在屏幕的底部。 – Question3r

+0

哎呦,固定。如果您執行'Debug.Log(offsetZ);'',您在70度旋轉處獲得offsetZ值,在30處獲得y值?它應該與數學(〜10.9f)一致。你是否將偏移量應用於相機z位置? – ryeMoss

+0

您可以在開始時使用光線投射。 – Everts