모바일 기기의 가속도 센서 사용하기

# 학습 과정 소개

`MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다.

# MobileAccelerometerService

`MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용 중이라면 안내가 필요합니다.
    
    
    @Component
    script AccelerometerToggler extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            if _MobileAccelerometerService:IsHWSupported() then
                if _MobileAccelerometerService:IsEnabled() then
                    _MobileAccelerometerService:Stop() 
                else
                    _MobileAccelerometerService:Start()
                end
            else
                _UIToast:ShowMessage("Failed to start Accelerometer")
            end
        end
    end
    

# 활용 예제

모바일 기기를 특정 방향으로 기울였을 때, 그 방향으로 공이 굴러가게 만들어 봅시다.

[gif](1669116956573f5e430d1d6b546baa73dab2a0ecd76f5)

#### 벽 만들기

  1. Hierachy - World - maps - map01에서 콘텍스트 메뉴를 열어 Switch to RecTileMap을 선택합니다.

  2. Hierachy - World - maps - map01에 PhysicsSimulatorComponent를 추가합니다.

  3. 새로운 Wall 엔티티를 생성하고, TransformComponent, SpriteRendererComponent, CustomeFootholdComponent를 추가합니다.

  4. 벽 모양 RUID를 SpriteRendererComponent - SpriteRUID에 입력하고, 스프라이트 크기만큼 CustomFootholdComponent로 발판을 생성합니다.

     * SpriteRUID: 9b518d2cf3a549f4bdbbac8662fecd42
  5. PhysicsColliderComponent를 추가하고, 충돌 영역을 스프라이트 크기에 맞게 조정합니다.

  6. PhysicsRigidbodyComponent를 추가하고, 프로퍼티를 설정합니다.

     * BodyType: Static
     * Friction: 0.2
     * Restitution 0.5
     * CollisionDetectionMode: Continuous
  7. 만든 벽을 3개 복사해 사각형 벽을 만듭니다.




#### 공 만들기

  1. 새로운 TiltBall 엔티티를 생성하고,TransformComponent, SpriteRendererComponent를 추가합니다.
  2. 공 모양 RUID를 SpriteRendererComponent - SpriteRUID에 입력합니다. 
     * SpriteRUID: 777ee92d25c84f839a12739590d149b6
  3. TiltBall에 PhysicsColliderComponent를 추가하고, ColliderType을 Circle로 설정한 뒤 충돌 영역을 스프라이트에 맞게 지정합니다.
  4. PhysicsRigidbodyComponent을 추가하고, 프로퍼티를 아래와 같이 설정합니다. 
     * BodyType: Dynamic
     * Mass: 1
     * Friction: 0.2
     * Restitution: 1
     * CollisionDetectionMode: Discrete
     * GravityScale: 1
     * SleepingMode: StartAwake



#### 가속도 센서

  1. 새로운 AccelerometerLogic을 생성합니다.
  2. Property를 아래와 같이 추가하고, BallEntityRef에 TiltBall을 지정합니다. 
         
         @Component
         script BallForceController extends Component
         property EntityRef BallEntityRef = "/maps/map01/TiltBall"
         property number ForcePower = 100
         end
         



    
    
    3. `MobileAccelerometerService:IsHWSupported()`를 활용해 기기에서 가속도 센서를 지원하는지 확인한 뒤, 가속도 측정을 시작합니다.
        ```lua
    @Component
    script MobileAccelerometerActivator extends Component
        method void OnBeginPlay()
        if _MobileAccelerometerService:IsHWSupported() then
        	_MobileAccelerometerService:Start()
        end
        end
    end
    

  4. 가속도 측정을 시작하면 기기가 기울어진 방향에 따라 공이 움직이도록 아래와 같이 작성합니다. 
         
         @Component
         script TiltBallController extends Component
         method void OnUpdate(number delta)
         if _MobileAccelerometerService:IsEnabled() then
             local AccelerationDirection = _MobileAccelerometerService:GetLastAcceleration()
             local direction = Vector2(AccelerationDirection.x, AccelerationDirection.y)
             self:Tilt(direction)
         end
         end
         
         @ExecSpace("ServerOnly")
         method void Tilt(Vector2 direction)
         self.BallEntityRef.PhysicsRigidbodyComponent:ApplyForce(direction * self.ForcePower)
         end
         end
         



    
    
    ##### 참고 가이드
    * [발판 만들기](/docs/?postId=71)
    * [RectTileMap의 활용](/docs/?postId=589)
    * [물리 사용하기](/docs/?postId=757)