Unity 2D碰撞器被困在墙上?

时间:2015-08-11 19:41:28

标签: c# unity3d 2d collision-detection physics

我刚刚从今天早上5.0.0将Unity更新到版本5.2.1,我遇到了一些问题。在Unity将游戏翻译为新版本后,我测试了游戏。一切都很好,除了当我在游戏中射击子弹时,它们会粘在墙壁上而不是从它们上弹跳,但只能在某些角度和距离。这就像子弹太快了,它跳过撞击对撞机并卡在对撞机里面。这会有点意义,但奇怪的是我在游戏中有慢速运动的C#脚本。每当我打开慢动作然后再将其关闭时,子弹贴的问题就会消失。我似乎无法弄清楚导致问题的原因在我更新软件之前肯定不存在。任何人都可以帮我解决这个问题吗?谢谢。我将发布下面的子弹脚本和慢动作脚本。顺便说一下,子弹在玩家脚本中实例化。

子弹脚本:

using UnityEngine;
using System.Collections;

public class Bullet : MonoBehaviour {

public float bulletSpeed;
public float bulletOpacity;
public bool fadeOut;

Animator anim;
Rigidbody2D rigidbod;
SpriteRenderer spriterend;

public GameObject player;
public float aimRotation;

// Use this for initialization
void Start () {

    anim = GetComponent<Animator> ();
    rigidbod = GetComponent<Rigidbody2D> ();
    spriterend = GetComponent<SpriteRenderer> ();

    rigidbod.velocity = transform.right * bulletSpeed;
    rigidbod.gravityScale = 0;

    bulletOpacity = 1;

}

// Update is called once per frame
void Update () {

    Destroy (gameObject, 3f);

    spriterend.color = new Color (1f, 1f, 1f, bulletOpacity);

    if (fadeOut == true)
        bulletOpacity -= 0.03f;

    if (bulletOpacity <= 0)
        Destroy (gameObject);

    aimRotation = player.GetComponent<Player> ().aimRotation;

}

void OnTriggerEnter2D (Collider2D bulletHit) {

    /*if (bulletHit.gameObject.layer == LayerMask.NameToLayer ("vulnerableLayer")) {

    }*/
    rigidbod.gravityScale = 1;
    rigidbod.drag = 1;
    fadeOut = true;

}

}

慢动作脚本:

using UnityEngine;
using System.Collections;

public class SlowMotion : MonoBehaviour {

public float currentLongevity = 0f;
public float slowAmount = 0.2f;
public float normalTime = 1f;
public float slowLongevity = 0.4f;


// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

    if (Input.GetMouseButtonDown (1)) {
        Time.fixedDeltaTime = 0.0f * Time.timeScale;
        if (Time.timeScale == normalTime)
            Time.timeScale = slowAmount;
    }

    if (Time.timeScale == slowAmount) {
        currentLongevity += Time.deltaTime;
    }

    if (currentLongevity > slowLongevity) {
        currentLongevity = 0;
        Time.timeScale = normalTime;
    }

}
}

1 个答案:

答案 0 :(得分:1)

因为你表示“怪异”。在运行SlowMotion脚本后,bullet行为停止,我建议问题与设置Time.fixedDeltaTime有关,就像在SlowMotion脚本的Update()方法中一样。您之后的评论也支持这一点,即“怪异”的评论。当你将rigidBody2D的碰撞检测设置为连续时,不再出现这种行为(我认为是子弹的RigidBody2D)。

Continuous RididBody2D碰撞检测可以确定更新之间是否发生了 ,其中Discrete碰撞检测在物理更新期间注册了碰撞 。在SlowMotion脚本中,以下行(在Update()方法中)将fixedDeltaTime设置为

Time.fixedDeltaTime = 0.0f * Time.timeScale;

由于Time.fixedDeltaTime 执行物理和其他固定帧速率更新的间隔(以秒为单位),因此必须存在一些实际运行帧速率的最小值(0.0)不能是实际的帧速率更新间隔)。当Time.fixedDeltaTime == 0.0时,Unity可以使用默认的最小值或使用它来指示帧更新尽可能频繁地运行(尽管我没有对此进行测试)。由于Bullet脚本调用Update()而不是FixedUpdate(),因此无法保证实际的interval between the frame updates is uniform。我怀疑当你运行SlowMotion脚本并将Time.fixedDeltaTime设置为0.0时,Unity会以尽可能小的帧更新间隔运行,并且在此之后,它会渲染预期的子弹行为。

测试此方法的一种方法是在编辑器中将初始Time.fixedDeltaTime设置为0.0(并且对于子弹的RididBody2D,您的碰撞检测行为将回到离散状态。)

在编辑器中设置Time Manager fixedDeltaTime主菜单 - &gt;编辑 - &gt;项目设置 - &gt;时间

如果发现fixedDeltaTime有效,可以在编辑器中设置它,并在Awake()方法中检索SlowMotion脚本中的初始值,以初始化基本fixedDeltaTime。我不建议使用fixedDeltaTime == 0.0,因为在文档中没有指示0.0的时间间隔的一致行为,并且它可能更多地绑定到底层硬件并且可能导致更多意外行为。

希望这有帮助,欢呼!