2013-01-14 103 views
12

我嘗試爲Android創建遊戲,並且遇到高速物體的問題,他們不想碰撞。如何在Unity中以高速碰撞物體

我有球體與球撞機和快活材料,和剛體與此PARAM(比重=假,插值=插值,碰撞檢測=連續動態)

另外我有3周壁與盒撞機和快活材料。

這是我的球

function IncreaseBallVelocity() { 
rigidbody.velocity *= 1.05; 
} 

function Awake() { 
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse); 

InvokeRepeating("IncreaseBallVelocity", 2, 2); 
} 

代碼在項目設置我設置:「閩滲透懲罰力」 = 0.001,「求解互爲作用計數」 = 50

當我開始玩它工作得很好(它會彈跳),但當速度變得很高時,球體就會穿過牆壁。

任何人都可以幫助我嗎?

謝謝。

編輯

var hit : RaycastHit; 

var mainGameScript : MainGame; 

var particles_splash : GameObject; 

function Awake() { 
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse); 

InvokeRepeating("IncreaseBallVelocity", 2, 2); 
} 

function Update() { 
if (rigidbody.SweepTest(transform.forward, hit, 0.5)) 
    Debug.Log(hit.distance + "mts distance to obstacle"); 
if(transform.position.y < -3) { 
    mainGameScript.GameOver(); 
    //Application.LoadLevel("Menu"); 
} 
} 

function IncreaseBallVelocity() { 
rigidbody.velocity *= 1.05; 
} 

function OnCollisionEnter(collision : Collision) { 
Instantiate(particles_splash, transform.position, transform.rotation); 
} 

EDITED增加了更多的信息

  1. 固定時間步長= 0.02最大允許的Tir = 0.333
  2. 有一個在編輯器播放器和運行在Android上的遊戲沒有什麼區別
  3. 編號當我設置爲0.01時,它看起來不錯
  4. 我的槳板是沒有剛體的箱子對撞機,牆壁都是一樣的
  5. 所有在同一層(當速度正常時,它的全部工作)在PhysicsManager中的值是默認的(與圖像中的相同)exert「Solver Interation Co. ..「= 50
  6. 沒有當我改變速度它通過其他牆
  7. 我使用標準的立方體,但我擴大/縮小它,以適應我的屏幕和其他對象,當我擴大牆壁,然後它可以彈跳
  8. 編號這是簡單的項目簡單的例子從視頻http://www.youtube.com/watch?v=edfd1HJmKPY
  9. 我不使用重力

回答

4

參見:

  1. Similar SO Question
  2. 使用光線追蹤,以幫助管理快速對象
  3. UnityAnswers post導致(2)

劇本你也可以嘗試改變A community scriptfixed time step for physics。該值越小,Unity計算場景物理的次數就越多。但要注意,使這個值太小,說< = 0.005,可能會導致遊戲不穩定,尤其是在便攜式設備上。

上面的腳本最適合子彈或小物件。您可以manually force剛體碰撞測試:

public class example : MonoBehaviour { 
    public RaycastHit hit; 
    void Update() { 
     if (rigidbody.SweepTest(transform.forward, out hit, 10)) 
      Debug.Log(hit.distance + "mts distance to obstacle"); 

    } 
} 
+0

我嘗試設置爲物理0.01固定時間步長和它的工作,現在球可以站在更但是當它加快我有同樣的問題。 我嘗試DontGoThroughThings但我不確定這是正確的方式,我只是在我的Sphere JS腳本中複製代碼,我需要設置更多的東西嗎? – Kec

+0

@Kec不,只要你的球體有一個剛體組件。腳本只對非常粗糙的測試有用。使用什麼可能是你的對象的中心進行測試,但由於你有一個球體,你可以輕鬆地射出,最近的命中,如果該命中是<你的球體的半徑,停止球體 – Jerdak

+0

我嘗試各種但它沒有工作,現在我有這個代碼,所以你可以告訴我要改變什麼,我給代碼添加代碼灰。感謝幫助。 – Kec

1

我認爲主要的問題是Rigidbodyvelocity的操作。我會嘗試以下解決問題。

  1. 重新設計你的代碼,以確保IncreaseBallVelocityRigidbody每隔操縱中FixedUpdate調用。檢查是否有其他操作Transform.position
  2. 嘗試更換使用AddForce或類似的方法,使得物理引擎具有更高的機會來計算所有的依賴直接設定速度。
  3. 如果有更多的項目(主要玩家角色,...)所涉及到的相關物理計算,確保他們的代碼在運行FixedUpdate過。

我偶然發現了另一點是那些規模很大的網格。有一個GameObject的規模< = 0.01或> = 100肯定會對物理計算產生負面影響。根據docsthis Unity forum entry來自某位大師你應該避免使用Transform.scale值!= 1

還是不開心?好吧,接下來的測試是從高速開始,但沒有加速。在這個階段,我們想知道,如果高速本身或加速度是導致問題的原因。知道物理引擎開始失效的速度值會很有趣 - 請發佈它們以便我們可以比較它們。


編輯:一些更多的事情進行調查
6.7米/秒,聽起來並不多,這樣我想有一個特殊的理由或原因出問題的組合。

  • 您的Maximum Allowed Timestep夠高嗎?爲了測試,我建議5至10x Fixed Timestep。請注意,這可能會殺死幀頻,但可以在稍後添加。
  • 是否有編輯播放器和Android上運行遊戲有什麼區別?
  • 您是否注意到由於0.01FixedTimestep而導致幀速下降?這表明物理引擎可能有問題。
  • 難道是有靜態碰撞體(對象有對撞機但沒有Rigidbody),否則移動或操縱?這會導致PhysX中重新進行重新計算。
  • 怎麼樣的層:在相同的層RESP所有的牆。所涉及的圖層是否在collision detection matrix中進行了適當的配置?
  • 不反彈效果總是發生在同一面牆上嗎?如果是這樣,您可以複製第一面牆並將其放在第二面牆的位置,以查看此特定牆是否有問題。
  • 如果不費很大力氣,我會嘗試設置一些標準的立方體作爲牆壁,以確保transform.scale不應該歸咎於它(我對此做出了非常糟糕的體驗)。
  • 你從腳本中操縱重力或TimeManager.timeScale
  • 順便說一句:你使用重力? (應該沒問題只是
+0

好吧,我已經做了一些測試,結果如下: 1.當我設置Velocity = 6.7時,Ball在第一面牆上反彈,但是它通過第二面,在這種情況下方法OnCollisionEnter是調用但彈跳不起作用,也許它是某種東西我用的彈性材料有問題嗎? 2.當我增加牆寬或球半徑,那麼很好,反彈工作。 所有對Rigidbody的操作都在FixedUpdate中調用,我不使用IncreaseBallVelocity,我只是設置了rigidbody.AddForce(6.7,6.7,0,ForceMode.Impulse); – Kec

+0

我在創建球時就開始設定球的比例參數,就這些。但我對此更感興趣,它稱之爲OnCollisionEnter,但沒有彈跳,就像「彈性」材料不適合。 – Kec

+0

@Kec Well'Bounciness = 1' and'Bounce Combine = Max' should do。關於縮放:根據[docs](http://docs.unity3d.com/Documentation/Components/class-Transform.html)和[來自其中一位大師的論壇入口](http://forum.unity3d .com/threads/105468-Mesh-scale-factor-vs-Transform-scale),你應該避免使用Transform.scale值!= 1. – Kay