using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class testScripts : MonoBehaviour
{
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.layer == 6)
{
return;
}
int thisID=GetInstanceID();
gameObject.name += "_" + thisID.ToString();
DateTime currentTime = DateTime.Now;
Debug.Log(thisID+" 현재 시간: " + currentTime.ToString("yyyy-MM-dd HH:mm:ss.fffffff"));
}
}
위와같은 코드를
아래와 같은 상황에서, 아래에 존재하는 두개의 박스에 컴포넌트로 부착하고, 위에서 각 박스에 대한 x좌표의 중간값에 박스를 놓고 자유낙하 시켰을때, 동시에 닿아야 할것 같은 상황에서 과연 동시에 닿고, 그렇게 닿는 처리가 OnCollisionEnter2D에 의해 정확히 이루어지는지에 대해 알기 위해 이와같은 실험을 구상하였다.
이와같은 실험에서 씬을 시작한뒤 자유낙하 시키면
이와같이 시간대가 다르게 나오고, 어느것이 먼저 동작했는지 알 수 있었는데,
이때에 오른쪽에 놓인 박스와 왼쪽에 놓인 박스가 지속적으로 한쪽만 먼저 실행되는것이 아니라, 어떤 경우에는 오른쪽 박스에서 먼저 실행되고, 어떤 경우에는 좌측 박스에서 먼저 실행되는등 규칙성을 알 수 없는 형태로 동작하였다.
이때에 처음에
Debug.Log(thisID+" 현재 시간: " + currentTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
처럼 입력해서 소수 3번째 자리까지만 출력한다면 동일한 값을 출력하는 경우가 존재했으나,
이것을
Debug.Log(thisID+" 현재 시간: " + currentTime.ToString("yyyy-MM-dd HH:mm:ss.fffffff"));
소수 7번째 자리처럼 내가 임의로 더 확인하는 범위를 넓혀서 진행해보니 대략 20~30번정도 실험해보았을때
겹치지 않는 모습을 보였다.
이와같이 동일한 높이에서 물리적으로는 완전하게 동일하게 ( 현재 구현되어있는 실험 환경상 유체에 의한 dragForce가 없으므로 진공낙하 실험과 동일할것이고, 추가적으로 토크가 발생할만한 외부요인이 없는 상황이기에) 낙하 하여서 완전하게 동일한 시간에 충돌한다고 인지하게 될 수 있는 상황에서도, 지속적으로 OnCollisionEnter2D() 를 통한 Collsion 발생시의 로직 구현에서 우선순위가 발생함을 알 수 있었다.
위와같은 검색 결과를 통해서 유니티의 2d 물리엔진의 구현의 경우 Box2D 라는 오픈소스 물리엔진을 베이스로 한다고 알수 있었는데, 현재의 기본 물리엔진을 사용하는 상황에서는 위의 실험과 같이 완전하게 동일하게 충돌이 발생하는 경우로 물리학적으로는 이해되는 상황에서도 스크립트에 의한 로직의 실행이 완전하게 동일하게 일어나지 않는다는것, 그리고 그 우선순위의 경우가 지속적으로 바뀔 수 있다는것을 인지하고 있는것이 더욱 정교한 물리기반 로직을 구현하는데 있어서 도움이 될 것이라 생각된다.
++
https://github.com/erincatto/box2d
GitHub - erincatto/box2d: Box2D is a 2D physics engine for games
Box2D is a 2D physics engine for games. Contribute to erincatto/box2d development by creating an account on GitHub.
github.com
box2d의 경우 깃헙에 공개되어 있는 오픈소스 2d 물리엔진이다.
현재 유니티의 경우 패키지매니저를 통해서 havok physics 를 적용할 수 있는 것으로 알고있는데,
위와같이 physics engine을 바꾸게 되는 경우는 위와같이 실험내용이 다르게 동작할 수 있을수도 있다는것을 인지하고 해당 물리엔진에 대해서 제대로 엔진의 특성을 이해하고 더욱 정교한 내부구현 로직을 이해하는것이 정교한 물리를 통한 로직 구현에 도움이 될 것이다. 항상 물리를 정교하게 요구하는 로직 구현의 경우 주의하도록 하자.
<Havok Physics 공식 사이트>
https://www.havok.com/havok-physics/
Havok Physics
Make game worlds real Our award-winning physics SDK is the most optimized, stable middleware in the games industry today and is accompanied by unparalleled engagement and technical support.
www.havok.com
++
추가사항으로 위와같이 Unity Physics 라는것도 존재하는데, 아직 install 되어있는 상황이 아닌것으로 보아서 아무 설정을 하지 않은 상황에서 2d 프로젝트에서 사용하는 physics 2d 에 적용된 물리엔진으로 보이지는 않고, install을 해서 대체하는 요소로 보여지는데, 이에 대해서는 아직 깊이있게 탐구해보지 못하여서 기회를 갖고 공부해보도록 하자
'Unity' 카테고리의 다른 글
Rigidbody에서 Is Kinematic 과 OncollisionEnter, OncollisionExit 사용시 주의사항. (0) | 2024.03.04 |
---|---|
실험을 위해 스크립트 컴포넌트를 다른곳에 여러개 붙여두고 체크박스를 해제해놓았을 때의 문제점과 주의사항. (0) | 2024.02.28 |
유니티 Simulator 상에서 마우스를 통한 입력의 처리. (*마우스로 Touch 입력을 받으려는 상황에서 주의사항*) (0) | 2024.02.18 |
Enter Play Mode Settings 를 활용한 Play Mode 진입 시간 단축 (0) | 2024.02.16 |
Time.timeScale =0; 으로 설정시에 AnimatedBtton 클래스의 비정상적인 동작과 이유. (0) | 2024.02.13 |