본문 바로가기
유니티강좌

보트 컨트롤을 통한 전진 가속도, 후진 그리고 회전 구현(유니티 2D 기초 강좌). Unity C# Script(AddRelativeForce)

by Ncube 2020. 11. 28.

 

 

엑셀을 밟듯이 가속 속도가 증가하며 후진 가속도도 적용. 오브젝트의 중심점을 엔진에 위치시켜 전면부를 회전시킵니다. 섬의 외곽라인을 Polygon Collider 2D로 접촉면 설정.

 

가속 #AddRelativeForce #Sprite Editor

 

Mathf.Sign은 float f의 부호를 반환하는 함수이다. 즉, 0이나 양수일 경우 1을, 음수일 경우 -1을 반환한다.

rigidbody.velocity.magnitude : rigidbody의 속도

 

AddForce는 월드 좌표를 기준으로 힘이 가해지며, 해당 게임오브젝트의 로컬 좌표를 기준으로 힘을 가하고 싶다면 AddRelativeForce를 사용한다. AddForce를 사용하면서 해당 게임 오브젝트의 로컬 좌표로 힘을 주려면 AddForce(transform.forward) 로 주면 되고,AddRelativeForce를 사용하면 AddRelativeForce(Vector3.forward)와 같이 사용할 수 있다.

 

 

[MoveBoat.cs]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveBoat : MonoBehaviour
{
    Rigidbody2D rb;

    [SerializeField] float accelPower = 1f;

    [SerializeField] float rotatePower = 1f;

    float rotateAmount, speed, direction;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();

    }

    private void FixedUpdate()
    {
        rotateAmount = -Input.GetAxis("Horizontal");

        speed = Input.GetAxis("Vertical") * accelPower;

        //Mathf.Sign은 float f의 부호를 반환하는 함수. 0이나 양수일 경우 1을, 음수일 경우 -1을 반환
        direction = Mathf.Sign(Vector2.Dot(rb.velocity, rb.GetRelativeVector(Vector2.up)));

        //rigidbody.velocity.magnitude는 rigidbody의 속도
        rb.rotation += rotateAmount * rotatePower * rb.velocity.magnitude * direction;

        //AddForce는 월드 좌표를 기준으로 힘이 가해지며, 
        //해당 게임오브젝트의 로컬 좌표를 기준으로 힘을 가하고 싶다면 AddRelativeForce를 사용
        rb.AddRelativeForce(Vector2.up * speed);

        //AddForce를 사용하면서 해당 게임 오브젝트의 로컬 좌표로 힘을 주려면 AddForce(transform.forward) 로 주면 되고,
        //AddRelativeForce를 사용하면 AddRelativeForce(Vector3.forward)와 같이 사용할 수 있다.
        rb.AddRelativeForce(-Vector2.right * rb.velocity.magnitude * rotateAmount / 2);

    }

}

 

댓글