2013-03-31 24 views
2

http://answers.unity3d.com/questions/212189/camera-shake.html 我已經按照上面的問題的答案嘗試讓我的第一人稱相機工作。但我試圖修改它,以便相機從不可見的碰撞盒中搖晃。相機在統一碰撞3d

到目前爲止,我的相機晃動腳本看起來像這樣;

public bool Shaking; 
private float ShakeDecay; 
private float ShakeIntensity; 
private Vector3 OriginalPos; 
private Quaternion OriginalRot; 

void Start() 
{ 
Shaking = false; 
} 

void OnTriggerEnter(Collider collision) 
{ 
if(collision.gameObject.name == "ShakeTrigger") 
{ 
    DoShake(); 
    Debug.Log("The camera trigger has hit"); 
} 
} 


void Update() 
{ 
if(ShakeIntensity > 0) 
{ 
    transform.position = OriginalPos + Random.insideUnitSphere * ShakeIntensity; 
    transform.rotation = new Quaternion(OriginalRot.x + Random.Range(-ShakeIntensity, ShakeIntensity)*.2f, 
           OriginalRot.y + Random.Range(-ShakeIntensity, ShakeIntensity)*.2f, 
           OriginalRot.z + Random.Range(-ShakeIntensity, ShakeIntensity)*.2f, 
           OriginalRot.w + Random.Range(-ShakeIntensity,  ShakeIntensity)*.2f); 

    ShakeIntensity -= ShakeDecay; 
} 
else if (Shaking) 
{ 
    Shaking = false; 
} 

} 


void OnGUI() { 

if (GUI.Button(new Rect(10, 200, 50, 30), "Shake")) 
    DoShake(); 
    //Debug.Log("Shake"); 

}  

public void DoShake() 
{ 
OriginalPos = transform.position; 
OriginalRot = transform.rotation; 

ShakeIntensity = 0.3f; 
ShakeDecay = 0.02f; 
Shaking = true; 
} 

我知道代碼通過gui按鈕100%工作。該腳本附加到第一人稱控制器上的相機。遊戲中有一個標籤爲ShakeTrigger的隱形碰撞盒。但是,調試日誌根本不會被調用,我不確定原因。

如果有人需要更多信息,請告訴我。

感謝提前:)

+1

「不可見」框對撞機是否檢查了「觸發器」?否則,OnTriggerEnter永遠不會被調用。還要確保相機連接到剛體碰撞器。 [這裏是一個很好的鏈接](http://docs.unity3d.com/Documentation/Components/class-MeshCollider.html)Unity的碰撞矩陣。 – Jerdak

+0

碰撞盒確實有'是觸發'檢查。我已經在一個單獨的腳本中附加了一些聲音,可以正常工作。具有這個腳本的攝像機是附屬於第一人稱控制器的「主攝像機」(我猜測它已經有了剛體)。仍然沒有得到這種方法工作正常:( – TJBaldy

回答

2

如果腳本被附加到你的相機,然後OnTriggerEnter在看相機觸發調用,不碰撞盒。

你可以做的一件事就是將OnTriggerEnter粘貼到一個新腳本中,並將其放入碰撞盒內。然後有做SendMessage函數沿着這些線路:

GameObject.Find("Camera").SendMessage("DoShake");

編輯:要回答Jerdak的問題。

代碼波紋管將是TriggerBox內:

void Start() 
{ 
    ... 
} 

void OnTriggerEnter(Collider collision) 
{ 
    if(collision.gameObject.name == "ShakeTrigger") 
{ 
    GameObject.Find("Camera").SendMessage("DoShake"); 
    Debug.Log("The camera trigger has hit"); 
} 
}... 

,這將是在照相機內:

void Start() 
{ 
    ... 
} 

public void DoShake() 
{ 
    OriginalPos = transform.position; 
    OriginalRot = transform.rotation; 

    ShakeIntensity = 0.3f; 
    ShakeDecay = 0.02f; 
    Shaking = true; 
}... 

這樣,triggerbox負責檢測觸發器和永遠只發送消息當正確的物體經過它時,可以向相機傳送。相機然後負責做搖動。

+0

這段代碼很好,但它會導致一個小故障,一旦我走進觸發器箱,它會使相機抖動,但它會將相機移到第一個人控制器後面:L。 「GUI上的按鈕調用相同的方法(DoShake),並且不會導致相同的問題。 – TJBaldy

+0

剛剛完成它的工作,我已將」Camera「引號更改爲」Main Camera「(這是它在第一個人控制器),沒有意識到這應該是「播放器」,我已經讀過SendMessage函數可能會損壞性能,但我現在就用它!非常感謝您的幫助:D – TJBaldy

+0

沒問題,很高興我可以幫助:) –