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;
}   我知道代码是100%通过gui按钮工作的。此脚本附加到第一人称控制器上的相机。游戏中有一个带有ShakeTrigger标签的隐形碰撞框。但是,调试日志根本不会被调用,我不确定为什么。
如果有人需要更多的信息,请让我知道。
提前感谢:)
发布于 2013-04-01 14:28:01
如果脚本附加到摄影机,则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负责检测触发器,只有当合适的对象通过它时,才会向相机发送消息。然后,摄像机负责进行摇动。
发布于 2021-03-18 23:59:54
要在碰撞或触发时摇动你的相机,你需要首先让你的摇动函数,你也可以从其他脚本调用
就像这样
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();
                    } 
             }
        }我附上一个参考视频给你,也许它会帮助你在更好的相机抖动。希望能对你有所帮助。
你可以参考我制作的这段视频https://youtu.be/9X_JXexwfR4
发布于 2020-08-26 02:30:56
如果您已设置刚体,则将插值从无更改为插值。
https://stackoverflow.com/questions/15733509
复制相似问题