게임엔진/DOTS

Physics 1.0 써보기

tsyang 2023. 2. 10. 00:57

2023.02.04 - [유니티/DOTS] - DOTS 1.0 - 2 (생성, MonoBehavour 연계)

 

DOTS 1.0 - 2 (생성, MonoBehavour 연계)

2023.01.29 - [유니티/DOTS] - DOTS 1.0 - 기본 (Component,System,Aspect,Job) DOTS 1.0 - 기본 (Component,System,Aspect,Job) 2023.01.01 - [유니티/DOTS] - DOTS 1.0 나온 기념 세팅법 DOTS 1.0 나온 기념 세팅법 ECS 1.0 pre-release 버전이

tsyang.tistory.com

 

 

세팅하기


 

저거 누르고 아래 이름 침

 

com.unity.physics

 

Entities먼저 까는 걸 잊지 말도록 

 

 

 

물리 시뮬레이션의 순서


  1. 물리 시스템이 상태를 얻어온다. 물리 시뮬레이션은 stateless하기 때문에 이게 첫번째로 일어나야 한다.
  2. broadphase를 수행한다. broadpahse에서 시뮬레이션은 높은 수준의 정보를 얻어온다. 활성화된 바디들이 겹치지 않는지 빠르게 체크한다. 
  3. narrowphase를 수행한다. 이때는 정확한 충돌 지점을 계산함
  4. 이런 충돌에 기반하여, 리턴값을 계산한다. 질량,마찰,반발력,충돌지점등을 이용해서,
  5. 새로운 속도를 계산함
  6. timestep만큼 바디들을 이동시킴
  7. 새로운 transform 반영

 

유니티 물리는 AABB타입의 경계를 사용함. 

https://www.researchgate.net/figure/Bounding-volumes-sphere-axis-aligned-bounding-box-AABB-oriented-bounding-box_fig9_272093426

 

 

써보기


Physics Shape & Physics Body

 

physics shape 추가해준다. 이게 기존의 Collider 개념

 

 

 

 

공하나 만들어주고 physics body도 추가 .. (Rigid body 개념)

 

 

떨어진다 

 

 

 

 

Physics Material

Physics material은 Physics body끼리 상호작용할 때 마찰력은 얼마나 되는지, 반발계수는 얼마나 되는지 등을 저장함. 이런 값들은 Pyhsics Material Template 에셋으로 저장될 수 있고 Physics Shape가 지정해줄 수도 있음.

 

 

 

프로젝트 창에 우클릭하면 Physics Material Template도 만들 수 있음.

 

굿~

 

 

PhysicsShape나 PhysicsBody는 Authoring 전용 컴포넌트로서 Baker가 여러 개의 컴포넌트를 추가해준다. PhysicsShape나 PhysicsBody라는 컴포넌트는 없다.

 

속도에 접근하고 싶다면 PhysicsVelocity를, RigidBody에 대응되는 개념에 접근하고 싶다면 PhysicsMass등에 접근하면 된다. 

 

예시로 여러 공을 생성해서 떨군 다음에 다시 잡아당겨보자

[BurstCompile]
public partial struct MovingISystem : ISystem
{
    public void OnCreate(ref SystemState state) { }
    public void OnDestroy(ref SystemState state) { }

    public void OnUpdate(ref SystemState state)
    {
        var attractionPoint = SystemAPI.GetSingleton<AttractionPointComponent>();
        var speed = attractionPoint.Speed;
        var targetTransform = SystemAPI.GetComponent<LocalTransform>(attractionPoint.TargetEntity);
        new MoveJob() { Speed  = speed, TargetPos = targetTransform.Position}.ScheduleParallel();
    }
}
[BurstCompile]
public partial struct MoveJob : IJobEntity
{
    public float3 TargetPos;
    public float Speed;
    
    public void Execute(RefRW<PhysicsVelocity> velocity, RefRO<LocalTransform> transform)
    {
        var direction = TargetPos - transform.ValueRO.Position;
        if (!math.any(direction)) return;
        direction = math.normalize(direction);
        
        velocity.ValueRW.Linear = direction * Speed;
    }
}

 

빨간 공이 Attraction Point이고 수동으로 Hierachy에서 enable시킴

 

 

 

Physics 1.0 문서 : https://docs.unity3d.com/Packages/com.unity.physics@1.0/manual/concepts-simulation.html