중력 시스템은 Unity에서 게임이나 애플리케이션을 만들 때 매우 중요한 구성 요소입니다. 지구의 중력에 의해 영향을 받는 개체를 시뮬레이션하고 사실적인 물리적 효과를 생성할 수 있습니다. Unity에서는 Rigidbody 구성 요소와 중력 벡터를 사용하여 중력 시스템을 제어할 수 있습니다.
먼저 Unity에서 오브젝트를 생성하고 강체로 만듭니다. 장면에서 개체를 선택하고 Inspector 패널에서 "Is Kinematic" 옵션을 선택하여 개체가 다른 힘의 영향을 받지 않도록 할 수 있습니다.
먼저 중력 구성 요소인 Rigidbody를 살펴보겠습니다.
Mass : 물체의 질량
Resistance (Drag) : 모의실험 중 마주치는 저항
Angular Drag(AngularDrag) : 회전 시뮬레이션 시 받는 저항
Use Gravity (UseGravity) : 중력 사용 여부
IsKinematic : 역학 활성화 여부, 오브젝트를 선택하지 않으면 중력 낙하가 없습니다.
Interpolate : 물체의 움직임 위치에 대한 Interpolator
충돌 감지(CollisionDetection): 충돌 감지 빈도를 높일 수 있습니다.
Constraints : 강체 모션을 제어하는 Constraints
충돌 감지 조건
1. 두 개체 모두 충돌 바디 구성 요소를 포함해야 합니다.
2. 하나 이상의 객체에 강체 구성 요소가 포함되어 있습니다.
충돌 감지 방법
OnCollisionEnter( Collision collisionInfo ) 두 개체가 충돌하기 시작할 때 한 번 트리거
OnCollisionExit( Collision collisionInfo ) 두 개체가 충돌할 때 한 번 트리거 end
OnCollisionStay( Collision collisonInfo ) 두 개체가 계속 충돌할 때 트리거
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. 두 개체 모두 충돌 바디 구성 요소를 포함해야 하며 개체 중 하나가 트리거로 확인됩니다.
2. 하나 이상의 객체에 강체 구성 요소가 포함되어 있습니다.
탐지를 트리거하는 방법
OnTriggerEnter( Collider other ) 두 객체가 충돌하기 시작할 때 한 번 트리거
OnTriggerExit( Collider other ) 두 객체의 충돌이 끝날 때 한 번 트리거
OnTriggerStay( Collider other ) 두 객체가 계속 충돌할 때 한 번 트리거
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);
}
}
}