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
メソッド内に制限され、コンパイル エラーが発生します。この問題を解決するには、クラスレベルのフィールドとして宣言して、クラス全体でアクセスできるようにします。同時に、メソッドでも取得する必要があります。OnCollisionEnter
OnCollisionEnter
playerRigidbody
OnCollisionEnter
playerRigidbody
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 で実装する場合、衝突ボディと剛体コンポーネントが分離されている場合、このトリガーとなる問題が発生することに注意してください (以下に示すように)。
ヒント:
物理的な動きを実装するときは、Rigidbody コンポーネントをスクリプトと同じゲーム オブジェクトにマウントする必要があります。衝突ボディがどこにあるかは関係ありません。トリックやトリックによって上記の構造的な問題が解決できるとは考えないでください。これにより、不要な作業負荷がGetComponentInChildren
発生しGetComponentInParent
3.2 経験豊富な操作と初心者の操作の違い
ゲームは、 や などのイベント駆動型ですOnCollisionEnter
。OnTriggerEnter
衝突を伴うイベントは、次の 2 つの方法で実装できます。
- プレーヤーによってトリガーされ、タグ認識を通じて、「私はシャオ・ミンに会ったので、シャオ・ミンが私に電話した」ということがよりよく理解されます。
- オブジェクト自体によって引き起こされるイベントもタグの認識ですが、それはオブジェクト自体によって支配されており、次のように理解できます: Xiao Ming が私に触れたので、彼は私に電話をかけました
経験豊富な操作は、これが必ずしも良いことを意味するわけではありませんが、小規模なプロジェクトに適しており、集まりやすくなります。オブジェクトをモジュールとして扱うことを選択した場合、これらのタイプのtag
プレハブを再利用できることを意味します。
経験豊富な操作を使用すると、特定のオブジェクトを変更または破棄する必要が生じた場合、関連するイベントの判断に影響を与える可能性があり、タグの名前変更や非推奨操作にも賢明ではありませんunity
。 。