4. 碰撞与物理
Unity 提供了丰富的物理系统来模拟真实世界中的物理现象,包括碰撞检测和物理行为控制。下面将详细介绍如何在 Unity 中处理碰撞和物理模拟,并提供详细的示例代码。
碰撞检测
碰撞器(Collider)介绍
碰撞器(Collider)是 Unity 中用于检测物体之间碰撞的组件。常用的碰撞器有 BoxCollider、SphereCollider、CapsuleCollider 和 MeshCollider 等。
示例:添加碰撞器
using UnityEngine;
public class AddCollider : MonoBehaviour
{
void Start()
{
// 为游戏对象添加一个 BoxCollider
gameObject.AddComponent<BoxCollider>();
}
}
在这个示例中,我们在游戏对象上添加了一个 BoxCollider,用于检测与其他物体的碰撞。
碰撞事件(OnCollisionEnter, OnCollisionStay, OnCollisionExit)
这些方法用于检测和处理物体碰撞时的事件。
示例:碰撞事件处理
using UnityEngine;
public class CollisionHandler : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
Debug.Log("Collision detected with " + collision.gameObject.name);
}
void OnCollisionStay(Collision collision)
{
Debug.Log("Still colliding with " + collision.gameObject.name);
}
void OnCollisionExit(Collision collision)
{
Debug.Log("Stopped colliding with " + collision.gameObject.name);
}
}
在这个示例中,当游戏对象与其他物体发生碰撞时,会输出相应的日志信息。
触发器
触发器(Trigger)是一种特殊的碰撞器,它不会阻挡物体,而是用于检测物体进入、停留和离开的事件。
触发器事件(OnTriggerEnter, OnTriggerStay, OnTriggerExit)
这些方法用于检测和处理物体与触发器交互时的事件。
示例:触发器事件处理
using UnityEngine;
public class TriggerHandler : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
Debug.Log("Trigger entered by " + other.gameObject.name);
}
void OnTriggerStay(Collider other)
{
Debug.Log("Still inside trigger with " + other.gameObject.name);
}
void OnTriggerExit(Collider other)
{
Debug.Log("Exited trigger from " + other.gameObject.name);
}
}
在这个示例中,当其他物体进入、停留或离开触发器时,会输出相应的日志信息。
示例:添加触发器
using UnityEngine;
public class AddTrigger : MonoBehaviour
{
void Start()
{
// 为游戏对象添加一个 SphereCollider 并设置为触发器
SphereCollider collider = gameObject.AddComponent<SphereCollider>();
collider.isTrigger = true;
}
}
在这个示例中,我们在游戏对象上添加了一个 SphereCollider,并将其设置为触发器。
Rigidbody与物理模拟
Rigidbody 是 Unity 中用于控制物体物理行为的组件。通过 Rigidbody,可以实现物体的重力、力的作用等物理效果。
示例:使用Rigidbody控制物理行为
using UnityEngine;
public class RigidbodyControl : MonoBehaviour
{
void Start()
{
// 为游戏对象添加一个 Rigidbody
Rigidbody rb = gameObject.AddComponent<Rigidbody>();
// 施加一个初始力
rb.AddForce(Vector3.up * 500);
}
void Update()
{
// 在按下空格键时施加一个向上的力
if (Input.GetKeyDown(KeyCode.Space))
{
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(Vector3.up * 500);
}
}
}
在这个示例中,我们为游戏对象添加了一个 Rigidbody 组件,并在开始时和按下空格键时施加一个向上的力。
综合示例
以下是一个综合示例,展示了如何在一个脚本中处理碰撞、触发器和物理行为:
using UnityEngine;
public class PhysicsHandler : MonoBehaviour
{
void Start()
{
// 添加一个 BoxCollider 和 Rigidbody
gameObject.AddComponent<BoxCollider>();
Rigidbody rb = gameObject.AddComponent<Rigidbody>();
// 设置 Rigidbody 的属性
rb.mass = 2.0f;
rb.drag = 0.5f;
// 添加并设置 SphereCollider 为触发器
SphereCollider triggerCollider = gameObject.AddComponent<SphereCollider>();
triggerCollider.isTrigger = true;
}
void OnCollisionEnter(Collision collision)
{
Debug.Log("Collision detected with " + collision.gameObject.name);
}
void OnTriggerEnter(Collider other)
{
Debug.Log("Trigger entered by " + other.gameObject.name);
}
void Update()
{
// 在按下空格键时施加一个向上的力
if (Input.GetKeyDown(KeyCode.Space))
{
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(Vector3.up * 500);
}
}
}