RigidbodyComponent

메이플스토리 움직임을 적용합니다. 중력 및 가·감속 영향을 받습니다.

# Properties

[{"index":"float AirAccelerationX","0":"공중에서의 속도를 보정합니다. 값이 증가할 수록 공중에서의 이동 속도가 빨라집니다."}]

[{"index":"float AirDecelerationX","0":"공중에서의 입력이 없을 경우 X축의 이동 속도가 얼마나 빠르게 멈추는지를 보정합니다."}]

[{"index":"boolean ApplyClimbableRotation (Sync)","0":"true인 경우 회전하거나 기울어진 사다리를 탄 캐릭터는 사다리의 모습을 따릅니다. false인 경우 캐릭터는 사다리의 기울기, 회전에 영향을 받지 않습니다."}]

[{"index":"float DownJumpSpeed","0":"아래 점프 시 위로 튀어 오르는 속도를 조절합니다."}]

[{"index":"boolean EnableKinematicMoveJump","0":"KinematicMove가 true일 때, 점프 기능을 사용할지 여부를 설정합니다."}]

[{"index":"float FallSpeedMaxX","0":"공중에서의 X축 최대 속도 제한값을 보정합니다."}]

[{"index":"float FallSpeedMaxY","0":"공중에서의 Y축 최대 속도 제한값을 보정합니다."}]

[{"index":"float Gravity","0":"중력값입니다. 공중에서 이동할 때에 지상으로 얼마나 빨리 떨어질 것인가와 연관이 있습니다. 입력값이 클수록 더욱 더 빠르게 떨어집니다."}]

[{"index":"boolean IgnoreMoveBoundary","0":"true인 경우 지형에 의해 생성된 맵 영역을 벗어날 수 있습니다."}]

[{"index":"boolean IsBlockVerticalLine","0":"true일 경우 기본 이동과 다르게 세로 지형이 무조건 막힙니다. 벽 같은 지형을 무조건 통과할 수 없도록 할 때 사용합니다."}]

[{"index":"boolean IsolatedMove","0":"값이 true일 경우 발판 끝에 도달해도 떨어지지 않습니다. 점프 같은 외부 이동으로는 발판을 벗어날 수 있습니다."}]

[{"index":"float JumpBias","0":"캐릭터가 얼마만큼 공중에 처음 뜰지를 설정합니다."}]

[{"index":"boolean KinematicMove","0":"true인 경우 탑다운 방식의 상하좌우 이동으로 변경됩니다."}]

[{"index":"Vector2 KinematicMoveAcceleration","0":"이동 속력을 설정합니다. KinematicMove가 true일 때 동작합니다."}]

[{"index":"AutomaticLayerOption LayerSettingType (Sync)","0":"RigidbodyComponent와 foothold, 사다리, 로프의 SortingLayer 값의 관계를 설정합니다."}]

[{"index":"float Mass","0":"질량을 설정합니다. 값이 클 수록 가감속이 느려지고 외부 요인에 대한 반응성이 낮아집니다. 0보다 큰 값만 설정할 수 있습니다."}]

[{"index":"Vector2 MoveVelocity (HideFromInspector)","0":"이동에 필요한 입력값입니다. 주로 MovementComponent에서 입력을 제어합니다. X가 양수일 경우 오른쪽, Y가 양수일 경우 위쪽을 나타냅니다."}]

[{"index":"Vector2 RealMoveVelocity (HideFromInspector)","0":"직전에 이동된 양을 나타냅니다. 읽기 전용이며 이동량 정보가 필요할 때 사용합니다. 이동 주체에 따라 유효한 실행공간이 존재하며 LocalPlayer는 Client, 그 외는 Server에서 값을 가집니다."}]

[{"index":"float WalkAcceleration","0":"지형 이동 시 가감속 값을 나타냅니다. 입력값이 클수록 더욱 더 빠르게 최대 속도에 도달합니다."}]

[{"index":"float WalkDrag","0":"지형 이동 시 미끄러짐에 저항하는 힘입니다. 입력값이 클수록 미끄러지지 않고 빠르게 멈추게 됩니다. 맵, 지형, 캐릭터의 속성을 계산해 최종 적용 값은 0.5부터 2 사이의 범위입니다."}]

[{"index":"float WalkJump","0":"점프 시 얼마나 높게 뛰어오를지에 대한 값입니다. 값이 클수록 높게 뜁니다."}]

[{"index":"float WalkSlant","0":"지형 이동 시 경사를 얼마나 잘 넘을 수 있는지와 연관된 값입니다. 입력값이 크면 급경사를 넘어갈 수 있습니다. 0부터 1 사이의 값을 가집니다."}]

[{"index":"float WalkSpeed","0":"지형 이동 시 최대 이동 속도 값을 조절합니다."}]

##### inherited from Component:

[{"index":"boolean Enable (Sync)","0":"컴포넌트 활성화 여부를 확인합니다."}]

[{"index":"boolean EnableInHierarchy (ReadOnly) (HideFromInspector)","0":"계층 구조상에서 이 컴포넌트가 Enable 상태인지를 반환합니다. Enable이 true일지라도 엔티티의 Enable이 false라면 false를 반환합니다."}]

[{"index":"Entity Entity (ReadOnly)","0":"이 컴포넌트를 소유한 엔티티입니다."}]

# Methods

[{"index":"void AddForce(Vector2 forcePower)","0":"엔티티에 가해지는 힘을 더합니다. 엔티티는 기존 힘에 추가로 더해진 힘의 방향으로 가·감속 운동을 하게 됩니다."}]

[{"index":"void AttachTo(string entityId, Vector3 offset)","0":"이 엔티티를 entityId에 해당하는 엔티티에게 붙힙니다. 이로서 이 엔티티는 물리 동작을 하지 않고 붙혀진 엔티티의 이동에 종속되게 됩니다."}]

[{"index":"void Detach()","0":"RigidbodyComponent:AttachTo(string, Vector3)로 다른 엔티티에 붙어 있던 엔티티를 떼어냅니다."}]

[{"index":"boolean DownJump()","0":"아래 점프를 수행합니다. 아래 점프는 지형 위에 있을 때만 유효합니다."}]

[{"index":"Foothold GetCurrentFoothold()","0":"현재 밟고 있는 Foothold를 반환합니다."}]

[{"index":"Vector2 GetCurrentFootholdPerpendicular()","0":"밟고 있는 지형의 수직선을 반환합니다."}]

[{"index":"boolean IsOnGround()","0":"지형 위에 서 있는지를 확인합니다."}]

[{"index":"boolean JustJump(Vector2 jumpRate)","0":"대상을 점프시킵니다."}]

[{"index":"void PositionReset()","0":"누적된 위치 계산 정보를 삭제하고, 현재 위치를 기반으로 새롭게 계산합니다."}]

[{"index":"boolean PredictFootholdEnd(float distance, boolean isFoward)","0":"지금 밟고 있는 발판에서 distance만큼 이동할 수 있는지 확인합니다. isForward가 true면 오른쪽, false면 왼쪽 방향을 확인합니다.현재 위치에서 발판 끝까지 거리가 distance보다 멀면 true, 가까우면 false를 반환합니다. 발판을 밟고 있지 않다면 false를 반환합니다."}]

[{"index":"void SetForce(Vector2 forcePower)","0":"엔티티에 가해지는 힘을 설정합니다. 엔티티는 설정한 힘의 방향으로 가·감속 운동을 하게 됩니다."}]

[{"index":"void SetForceReserve(Vector2 forcePower)","0":"힘을 즉시 가하지 않고, 현재 프레임에서의 이동이 끝난 후 주어진 입력값으로 힘을 대체합니다."}]

[{"index":"void SetPosition(Vector2 position)","0":"로컬 좌표 기준으로 엔티티의 위치를 설정합니다."}]

[{"index":"void SetUseCustomMove(boolean isUse) (Deprecated)","0":"더는 사용하지 않는 함수입니다. RigidbodyComponent의 Enable 프로퍼티를 사용하세요."}]

[{"index":"void SetWorldPosition(Vector2 position)","0":"월드 좌표 기준으로 엔티티의 위치를 설정합니다."}]

##### inherited from Component:

[{"index":"boolean IsClient()","0":"현재 실행 환경이 클라이언트인지 아닌지의 여부를 반환합니다."}]

[{"index":"boolean IsServer()","0":"현재 실행 환경이 서버인지 아닌지의 여부를 반환합니다."}]

# Events

[{"index":"FootholdCollisionEvent","0":"RigidBodyComponent가 발판에 충돌했을 때 발생하는 이벤트입니다."}]

[{"index":"FootholdEnterEvent","0":"엔티티가 발판에 붙었을 때 발생하는 이벤트입니다."}]

[{"index":"FootholdLeaveEvent","0":"엔티티가 발판에서 떨어졌을 때 발생하는 이벤트입니다."}]

[{"index":"RigidbodyAttachEvent","0":"엔티티가 RigidbodyComponent:AttachTo(string, Vector3)를 통해 특정 엔티티에 붙었을 때 발생하는 이벤트입니다. 플레이어는 클라이언트에서 발생하고, 그 외의 엔티티는 서버 공간에서 발생합니다."}]

[{"index":"RigidbodyClimbableAttachStartEvent","0":"Avatar가 사다리, 로프를 타기 전에 발생하는 이벤트입니다."}]

[{"index":"RigidbodyClimbableDetachEndEvent","0":"Avatar가 사다리, 로프에서 떨어진 후에 발생하는 이벤트입니다."}]

[{"index":"RigidbodyDetachEvent","0":"엔티티가 RigidbodyComponent:Detach()를 통해 Attach 상태가 해제될 때 발생하는 이벤트입니다. 플레이어는 클라이언트에서 발생하고, 그 외의 엔티티는 서버 공간에서 발생합니다."}]

[{"index":"RigidbodyKinematicMoveJumpEvent","0":"KinematicMove 프로퍼티가 true인 경우 점프하거나 착지하면 발생하는 이벤트입니다."}]

# Examples

#### AttachTo

특정 오브젝트에 닿으면 Attach 되고 attach 된 상태에서 3초 후 Dtach됩니다.
    
    
    @Component
    script TimedAttacher extends Component
        @Sync
        property number time = 0
        @Sync
        property boolean isAttached = false
    
        @ExecSpace("ClientOnly")
        method void AttachTo(string entityId)
        self.Entity.RigidbodyComponent:AttachTo(entityId, Vector3.zero)
        self.isAttached = true
        end
    
        @ExecSpace("ClientOnly")
        method void OnUpdate(number delta)
        if self.isAttached == false then
        	return
        end
    
        self.time = self.time + delta
    
        if self.time >= 3.0 then
        	self.Entity.RigidbodyComponent:Detach()
        	self.time = 0
        	self.isAttached = false
        end
        end
    
        @EventSender("Self")
        handler HandleTriggerEnterEvent(TriggerEnterEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: TriggerComponent
        -- Space: Server, Client
        ---------------------------------------------------------
    
        -- Parameters
        local TriggerBodyEntity = event.TriggerBodyEntity
        ---------------------------------------------------------
        if TriggerBodyEntity.Name == "Name" then
        	self:AttachTo(TriggerBodyEntity.Id)
        end
        end
    end
    

#### PredictFootholdEnd

발판의 끝점이 특정 distance만큼 떨어져 있는지 판별합니다. 캐릭터가 밟고 있는 발판에서 양의 방향으로 발판의 끝이 10보다 가까우면 true, 멀다면 false를 반환합니다. 이에 따라 Entity의 Enable이 변경됩니다.
    
    
    @Component
    script FootholdEdgeActivator extends Component
        @ExecSpace("ClientOnly")
        method void OnUpdate(number delta)
        local entity = _EntityService:GetEntityByPath(EntityPath)
        if self.Entity.RigidbodyComponent:PredictFootholdEnd(10, true) then
        	entity.Enable = true
        else
        	entity.Enable = false
        end
        end
    end
    

# SeeAlso

  * TriggerComponent
  * TriggerEnterEvent
  * [메이플 이동 개념 이해하기](/docs?postId=750)