using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour
{
public float gravity = -9.8f;
void Start()
{
// 중력 크기 조절 예시 (Y축 방향의 중력)
Vector3 customGravity = new Vector3(0f, gravity, 0f); // 중력 크기 및 방향 설정
Physics.gravity = customGravity; // 중력 크기 적용
}
}
터널링 방지를 위한 물리 콜라이더
물리 메터리얼
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PhysicsCollider : MonoBehaviour
{
private Rigidbody rBody;
[SerializeField] private Transform target;
private Vector3 previousPosition;
private Quaternion previousRotation;
void Start()
{
this.rBody = this.GetComponent<Rigidbody>();
previousPosition = target.position;
previousRotation = target.rotation;
}
private void FixedUpdate()
{
if (target != null)
{
// 현재 위치 및 회전을 저장합니다.
Vector3 currentPosition = target.position;
Quaternion currentRotation = target.rotation;
// 이전 위치 및 회전과 현재 위치 및 회전 간의 차이를 계산합니다.
Vector3 positionDelta = currentPosition - previousPosition;
Quaternion rotationDelta = currentRotation * Quaternion.Inverse(previousRotation);
// 이전 위치와 현재 위치 간의 거리를 계산합니다.
float distance = Vector3.Distance(previousPosition, currentPosition);
// 거리가 일정 값 이상인 경우에만 보간을 적용합니다.
if (distance > 0.001f)
{
float t = Time.fixedDeltaTime * 100f; // 조절 가능한 보간 계수
this.rBody.MovePosition(Vector3.Lerp(this.rBody.position, currentPosition, t));
this.rBody.MoveRotation(Quaternion.Slerp(this.rBody.rotation, currentRotation, t));
}
else
{
// Rigidbody에 이동과 회전을 적용합니다.
this.rBody.MovePosition(this.rBody.position + positionDelta);
this.rBody.MoveRotation(this.rBody.rotation * rotationDelta);
}
// 현재 위치 및 회전을 이전 값으로 업데이트합니다.
previousPosition = currentPosition;
previousRotation = currentRotation;
}
}
}
Unity Physics Joints를 통해 Grabbable을 연결합니다. 기본적으로 이는 고정 조인트(FixedJoint)를 사용하지만 사용자 정의 ConfigurableJoint를 사용하도록 설정할 수 있습니다. 이 변환기는 Grabbable이 변형 중에 환경과 계속 충돌(비운동학적)해야 하는 물리적 엔터티이거나 Grabbable 물리 도어의 경우에서 흔히 발생하는 것처럼 물리 조인트를 통해 환경에 연결될 때 유용합니다. 또는 레버. 옵션인 ConfigurableJoint를 사용하면 관련 없는 모션을 Free로 설정하고 사전 처리와 같은 다른 기능을 사용할 수 있습니다. 이는 사용자 정의 동작을 생성하는 데 도움이 되고 가끔 발생하는 물리적 결함을 제거할 수 있습니다. 이 선택적 ConfigurableJoint는 런타임 중에 복사되므로 비활성화된 GameObject에 배치해야 합니다.
Grabbable 구성 요소의 Two Grab Transformer 속성에 Two Grab Transformer 구성 요소를 할당해야 합니다. Two Grab Transformer 구성 요소를 추가하는 경우 One Grab Transformer 속성도 더 이상 자동 생성되지 않으므로 설정해야 합니다.
잡기 기본형을 만들고 다음 3가지 Transformer를 테스트 합니다
기본 잡기가 완성 되었습니다.
물리 던지기 까지 설정 해주자
TwoGrabFreeTransformer
포인팅 가능한 두 대상의 위치 및 회전 변경을 고려하여 Grabbable의 위치, 회전 및 크기를 업데이트합니다(크기에 대한 선택적 제약 조건 포함).
먼저 양속 잡기를 설정 하기 위해서는 다음 두개의 프로퍼티에 각각 넣어줘야 한다
다음과 같이 One Grab Free Transformer컴포넌트와 Two Grab Free Transformer컴포넌트를 부착 하고
넣어준다
실행후 결과를 확인 한다
크기를 제약 하고 싶다면 Min Scale과 Max Scale값을 수정하면 된다
TwoGrabRotateTransformer
피벗에 대한 두 개의 포인팅 가능한 대상의 회전 변경을 고려하여 Grabbable의 회전을 업데이트합니다(최소/최대 회전에 대한 선택적 제약 조건 포함).
Two Grab Free Transformer 컴포넌트를 제거 하고 Two Grab Rotate Transformer컴포넌트를 부착 한다
Grabbable의 Two Grab Transformer 프로퍼티에 넣어주자
Two Grab Rotate Transformer의 Rotation Axis 프로퍼티를 변경해 축을 바꿀수도 있고 Min/Max Angle을 이용해 각을 조절 할수도 있다
TwoGrabPlaneTransformer
주어진 평면에 대한 Grabbable의 위치와 배율뿐만 아니라 주어진 축에 대한 회전도 업데이트합니다(위치와 배율에 대한 선택적 제약 조건 포함).