簡體   English   中英

Unity 2D撞機卡在牆上?

[英]Unity 2D Colliders Stuck to Walls?

我今天早上剛剛將Unity從5.0.0更新到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;
    }

}
}

由於您指出在運行SlowMotion腳本后“怪異”項目符號行為停止了,因此我建議該問題與在SlowMotion腳本的Update()方法中進行設置Time.fixedDeltaTime有關。 您以后的評論也支持了這一點,即當您將rigidBody2D的碰撞檢測設置為連續(我假設的是子彈頭的RigidBody2D)時,“怪異”的行為不再出現。

連續的RididBody2D碰撞檢測可確定更新之間是否發生接觸,而離散碰撞檢測則在物理更新期間記錄了碰撞。 在SlowMotion腳本中,以下行(在Update()方法中)將fixedDeltaTime設置為零

Time.fixedDeltaTime = 0.0f * Time.timeScale;

由於Time.fixedDeltaTime執行物理和其他固定幀速率更新的時間間隔(以秒為單位) ,因此必須存在一些實際運行幀速率的最小值(0.0不能是實際的幀速率更新間隔)。 當Time.fixedDeltaTime == 0.0時,Unity可以使用默認最小值或使用此最小值來指示幀更新盡可能頻繁地運行(盡管我尚未對此進行測試)。 由於Bullet腳本調用Update()而不是FixedUpdate(),因此不能保證幀更新之間的實際間隔是一致的 我懷疑當您運行SlowMotion腳本並將Time.fixedDeltaTime設置為0.0時,Unity以最小的幀更新間隔運行,並且在此之后,它確實呈現了預期的項目符號行為。

一種測試方法是在編輯器中將您的初始Time.fixedDeltaTime設置為0.0(對於子彈的RididBody2D,您的碰撞檢測行為應恢復為離散狀態)。

要在編輯器中設置時間管理器fixedDeltaTime主菜單->編輯->項目設置->時間

如果找到一個有效的fixedDeltaTime,則可以在編輯器中進行設置,然后在Awake()方法的SlowMotion腳本中檢索初始值,以初始化基本的fixedDeltaTime。 我不建議使用fixedDeltaTime == 0.0,因為在文檔中沒有顯示時間間隔為0.0的一致行為,並且它可能更多地綁定到底層硬件,並且可能導致更多意外行為。

希望這會有所幫助,加油!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM