重力システムは、Unity でゲームやアプリケーションを作成する場合に非常に重要なコンポーネントです。地球の重力の影響を受けるオブジェクトをシミュレートし、現実的な物理効果を生成できます。Unity では、Rigidbody コンポーネントと Gravity Vector を使用して重力システムを制御できます。
まずはUnityでオブジェクトを作成し、剛体化します。シーン内でオブジェクトを選択し、インスペクターパネルで「Is Kinematic」オプションにチェックを入れることで、オブジェクトが他の力の影響を受けないようにできます。
まず、重力コンポーネント Rigidbody を見てみましょう。
質量: 物体の質量
抵抗 (ドラッグ) : シミュレーションの実行中に発生した抵抗
角度ドラッグ (AngularDrag) : 回転をシミュレートするときに受ける抵抗
Use Gravity (UseGravity) : 重力を使用するかどうか
IsKinematic : ダイナミクスが有効かどうかに関係なく、オブジェクトがチェックされていない場合、重力落下は発生しません。
Interpolate : オブジェクトの動作位置の補間器
衝突検出 (CollisionDetection):衝突検出の頻度を増やすことができます。
コンストレイント: 剛体の動きを制御するコンストレイント
衝突検知条件
1. 両方のオブジェクトに衝突ボディ コンポーネントが含まれている必要があります
2. 少なくとも 1 つのオブジェクトに剛体コンポーネントが含まれている
衝突検知方式
OnCollisionEnter( CollisioncollisionInfo ) 2 つのオブジェクトが衝突を開始したときに 1 回トリガー
OnCollisionExit( CollisioncollisionInfo ) 2 つのオブジェクトが衝突したときに 1 回トリガー end
OnCollisionStay( CollisioncollisionInfo ) 2 つのオブジェクトが衝突し続けたときにトリガー
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RigCollisionTest : MonoBehaviour
{
void OnCollisionEnter(Collision other)
{
Debug.Log("碰撞开始");
}
void OnCollisionStay(Collision other)
{
Debug.Log("持续碰撞");
}
void OnCollisionExit(Collision other)
{
Debug.Log("碰撞结束");
}
}
トリガー検出条件
1. 両方のオブジェクトに衝突ボディ コンポーネントが含まれている必要があり、オブジェクトの 1 つがトリガーとしてチェックされます。
2. 少なくとも 1 つのオブジェクトに剛体コンポーネントが含まれている
検出をトリガーする方法
OnTriggerEnter( Collider other ) 2 つのオブジェクトの衝突が始まるときに 1 回
トリガー OnTriggerExit( Collider other ) 2 つのオブジェクトの衝突が終了するときに 1 回トリガー
OnTriggerStay( Collider other ) 2 つのオブジェクトが衝突し続けるときに 1 回トリガー
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TriggerTest : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Debug.Log("触发开始");
}
void OnTriggerStay(Collider other)
{
Debug.Log("持续触发");
}
void OnTriggerExit(Collider other)
{
Debug.Log("触发结束");
}
}
Unity で Rigidbody コンポーネントを使用して移動およびジャンプする方法を示す簡単なコード例を次に示します。
using UnityEngine;
public class GravityDemo : MonoBehaviour
{
Rigidbody m_Rigidbody;
//移动速度
public float m_Speed = 20f;
//跳跃力
public float jumpforce = 200;
void Start()
{
m_Rigidbody = GetComponent<Rigidbody>();
}
void Update()
{
float hor = Input.GetAxis("Horizontal");
float ver = Input.GetAxis("Vertical");
Vector3 m_Input = new Vector3(hor, 0, ver) * Time.deltaTime * m_Speed;
//移动
m_Rigidbody.MovePosition(transform.position + m_Input);
if (Input.GetKeyDown(KeyCode.E))
{
//跳跃
m_Rigidbody.AddForce(transform.up * jumpforce);
}
}
}