http://answers.unity3d.com/questions/212189/camera-shake.html 我已经按照上面的问题回答,试着为我的第一人称相机拍摄相机。但我试图修改它,以便相机从一个看不见的碰撞盒摇晃。
到目前为止,我的相机抖动脚本看起来像这样;
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的隐形碰撞盒就在游戏中。但是,根本没有调用调试日志,我不确定原因。
如果有人需要更多信息,请告诉我。
提前致谢:)
答案 0 :(得分: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;
}...
这样,触发器负责检测触发器,并且只有在正确类型的对象通过它时才向相机发送消息。然后摄像机负责摇晃。
答案 1 :(得分:1)
要在碰撞或触发时晃动你的相机,你需要先创建你的 Shake 函数,你也可以从其他脚本调用该函数
类似的东西
public class ShakeCamera : MonoBehavior
{
public bool canShake;
private void Update()
{
if(canShake)
DoShake()
}
public void DoShake()
{
// Shake Logic
}
public void StartShake()
{
canShake = true;
}
public void StopShake()
{
canShake = false;
}
}
从你的其他脚本中,每当你触发目标对象时,你就可以这样调用它
public class TriggerScript: MonoBehavior
{
public ShakeCamera shakeCamera;
private void Start()
{
shakeCamera = FindObjectOfType<ShakeCamera>();
}
void OnTriggerEnter(Collider collision)
{
if(collision.gameObject.tag == "targetTag")// Change Tag accroding to your requirement
{
cameraShake.StartShake();
}
}
void OnTriggerExit(Collider collision)
{
if(collision.gameObject.tag == "targetTag")// Change Tag accroding to your requirement
{
cameraShake.StopShake();
}
}
}
我为您附上一个参考视频,可能会帮助您更好地避免相机抖动。希望有帮助。
答案 2 :(得分:-1)
如果已设置刚体,则将插值从无更改为插值。