13

Android 用のゲームを作成しようとしていますが、衝突したくない高速オブジェクトに問題があります。

スフィア コライダーと弾むマテリアルを含むスフィアと、このパラメーターを含むリジッドボディがあります (Gravity=false、Interpolate=Interpolate、Collision Detection = Continuous Dynamic)。

また、Box Collider と Bouncy マテリアルを使用した 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. 私のパドルは Rigidbody なしの Box Collider で、壁は同じです
  5. 同じレイヤーにすべてあります (速度が通常の場合はすべて機能します) PhysicsManager の値はデフォルト (画像と同じ) ですが、"Solver Interation Co..." = 50 を除きます。
  6. いいえ、速度を変えると、他の壁を通過します
  7. 標準の立方体を使用していますが、画面やその他のオブジェクトに合わせて拡大/縮小しています。壁をさらに拡大すると跳ね返っても問題ありません
  8. いいえ。ビデオhttp://www.youtube.com/watch?v=edfd1HJmKPYからの単純なプロジェクトの単純な例です。
  9. 重力は使いません
4

2 に答える 2

4

見る:

  1. 同様のSOの質問
  2. レイ トレーシングを使用して高速オブジェクトの管理を支援するコミュニティ スクリプト
  3. (2) のスクリプトにつながるUnityAnswers の投稿

物理学の固定時間ステップを変更することもできます。この値が小さいほど、Unity がシーンの物理を計算する回数が多くなります。ただし、この値を小さくしすぎると (たとえば <= 0.005)、特にポータブル デバイスでゲームが不安定になる可能性があることに注意してください。

上記のスクリプトは、弾丸や小さなオブジェクトに最適です。剛体衝突テストを手動で強制できます。

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");

    }
}
于 2013-01-14T22:10:31.860 に答える
2

Rigidbody主な問題はの操作だと思いますvelocity。問題を解決するために、次のことを試してみます。

  1. コードを再設計して、IncreaseBallVelocityおよび の他のすべての操作がRigidbody内で呼び出されるようにしますFixedUpdate。への他の操作がないことを確認しTransform.positionます。
  2. AddForce物理エンジンがすべての依存関係を計算する可能性が高くなるように、または同様の方法を使用して設定速度を直接置き換えてみてください。
  3. 物理計算に関連するアイテム (メイン プレイヤー キャラクターなど) が他にもある場合は、それらのコードも FixedUpdate で実行されるようにしてください。

私が遭遇したもう 1 つのポイントは、非常にスケーリングされたメッシュです。with スケール <= 0.01 または >= 100をGameObject持つことは、物理計算に明らかに悪影響を及ぼします。docsとこの Unity フォーラムの専門家のエントリによると、Transform.scaleの値を避ける必要があります != 1

まだ幸せではありませんか?OK では、次のテストは高速度で開始されますが、加速はありません。この段階で、問題の原因が高速度自体にあるのか、加速にあるのかを知りたいと考えています。物理エンジンが故障し始める速度の値を知ることは興味深いでしょう - 比較できるようにそれらを投稿してください。


編集:
6.7 m/秒はそれほど多くないように聞こえるので、問題が発生する特別な理由または理由の組み合わせがあると思います。

  • 最大許容タイムステップは十分に高いですか? テストの場合は 5 ~ 10x をお勧めしFixed Timestepます。これによりフレームレートが低下する可能性がありますが、後で修正できることに注意してください。
  • エディター プレーヤーと Android でゲームを実行する際に違いはありますか?
  • が原因でフレームレートが低下したことに気付きました0.01 FixedTimestepか? これは、物理エンジンに問題がある可能性があることを示しています。
  • Rigidbody他の方法で移動または操作される静的コライダー (コライダーを持っているが を持たないオブジェクト) があるのでしょうか? これにより、PhysX 内で大量の再計算が発生します。
  • レイヤーについて:すべての壁は同じレイヤーにあります。関連するレイヤーは、衝突検出マトリックスで適切に構成されていますか?
  • ノーバウンス効果は常に同じ壁で発生しますか? その場合、最初の壁をコピーして 2 番目の壁の代わりに配置し、この特定の壁に問題があるかどうかを確認していただけますか。
  • それほどの努力がなければ、壁としていくつかの標準立方体を設定しようとしますが、それが原因でtransform.scaleはないことを確認します (私はこれで本当に悪い経験をしました)。
  • 重力を操作しますTimeManager.timeScaleか、それともスクリプト内から操作しますか?
  • ところで:あなたは重力を使っていますか?(ただ問題ないはずです
于 2013-01-17T20:54:57.233 に答える