[Unity] バウンス プラットフォーム/リバウンド プレーヤーを実装する 2 つの方法 (トランポリンの物理的効果を実現するプレーヤー トリガー イベントとオブジェクト自己トリガー イベント)

1. 声明

物理的な反発効果のみが得られ、トランポリンのような視覚的なストレッチ効果は得られませんので、該当するコードをご自身で見つけてください。

2. 実現

練習した結果、プラットフォームの反発効果を実現したい場合は、プレーヤーに物理的なマテリアルを追加する (プラットフォームを追加しても意味がありません)、または
ここに画像の説明を挿入します

しかし、これでは問題が発生し、3D コントローラーを使用してゲームを作成する場合、プレーヤーはいかなる状況でもコントローラーをバウンスする必要がありません。

2.1 経験豊富な操作

したがって、この質の高い記事https://blog.csdn.net/LLLLL__/article/details/117266549
を参照して、プレーヤーの移動コードに次のコードを追加できます

  • contacts[0]メモリのガベージが生成されるため、避けてください。GetContact 代わりにorを使用しますGetContacts。つまり、other.GetContact(0).normal
	private Vector3 lastDir;
	private void LateUpdate()
    {
    
    
        lastDir = rb.velocity;
    }

    private void OnCollisionEnter(Collision other)
    {
    
    
        if (other.gameObject.tag == "Wall")
        {
    
    
            Vector3 reflexAngle = Vector3.Reflect(lastDir, other.contacts[0].normal);
            rb.velocity = reflexAngle.normalized * lastDir.magnitude;
        }
    }

2.2 初心者向けの操作

以下のオプションが当社のプラットフォームにマウントされます。
:メソッド内で宣言されているため、スコープは
playerRigidbodyメソッド内に制限され、コンパイル エラーが発生します。この問題を解決するには、クラスレベルのフィールドとして宣言して、クラス全体でアクセスできるようにします。同時に、メソッドでも取得する必要がありますOnCollisionEnterOnCollisionEnter
playerRigidbody
OnCollisionEnterplayerRigidbody

using UnityEngine;

public class Bounch_Platform : MonoBehaviour
{
    
    
    private Vector3 lastDir;
    private Rigidbody playerRigidbody; // 声明为类级别字段

    private void OnCollisionEnter(Collision other)
    {
    
    
        // 检测是否碰到了玩家(假设玩家有一个标签为 "Player")
        if (other.gameObject.CompareTag("Player"))
        {
    
    
            playerRigidbody = other.gameObject.GetComponent<Rigidbody>(); // 获取玩家的刚体
            if (playerRigidbody != null)
            {
    
    
                Vector3 reflexAngle = Vector3.Reflect(lastDir, other.GetContact(0).normal);
                // 应用反射角度来实现弹跳
                playerRigidbody.velocity = reflexAngle.normalized * lastDir.magnitude;
            }
        }
    }

    private void LateUpdate()
    {
    
    
        if (playerRigidbody != null)
        {
    
    
            lastDir = playerRigidbody.velocity;
        }
    }
}

3. 追加の注意事項

3.1 トリガーイベントの使用に関する問題

  • コライダーColliderと衝突Collisionは同じものではないことに注意してください。is triggerこのリバウンド効果を完成させるために、トリガー イベント (クリックされたと仮定して) の使用を検討する人もいるかもしれません。
  • ただし、Unity で実装する場合、衝突ボディと剛体コンポーネントが分離されている場合、このトリガーとなる問題が発生することに注意してください (以下に示すように)。

![画像の説明を追加してください](https://img-blog.csdnimg.cn/66c8be7923574efcbfe620180a10ec42.png)

ヒント:
物理的な動きを実装するときは、Rigidbody コンポーネントをスクリプトと同じゲーム オブジェクトにマウントする必要があります。衝突ボディがどこにあるかは関係ありません。トリックやトリックによって上記の構造的な問題が解決できるとは考えないでください。これにより、不要な作業負荷がGetComponentInChildren発生しGetComponentInParent

3.2 経験豊富な操作と初心者の操作の違い

ゲームは、 や などのイベント駆動型ですOnCollisionEnterOnTriggerEnter衝突を伴うイベントは、次の 2 つの方法で実装できます。

  • プレーヤーによってトリガーされ、タグ認識を通じて、「私はシャオ・ミンに会ったので、シャオ・ミンが私に電話した」ということがよりよく理解されます。
  • オブジェクト自体によって引き起こされるイベントもタグの認識ですが、それはオブジェクト自体によって支配されており、次のように理解できます: Xiao Ming が私に触れたので、彼は私に電話をかけました

経験豊富な操作は、これが必ずしも良いことを意味するわけではありませんが、小規模なプロジェクトに適しており、集まりやすくなります。オブジェクトをモジュールとして扱うことを選択した場合、これらのタイプのtagプレハブを再利用できることを意味します。

経験豊富な操作を使用すると、特定のオブジェクトを変更または破棄する必要が生じた場合、関連するイベントの判断に影響を与える可能性があり、タグの名前変更や非推奨操作にも賢明ではありませんunity。 。

4. 最終的な効果

画像の説明を追加してください

おすすめ

転載: blog.csdn.net/kokool/article/details/133553177