엑셀을 밟듯이 가속 속도가 증가하며 후진 가속도도 적용. 오브젝트의 중심점을 엔진에 위치시켜 전면부를 회전시킵니다. 섬의 외곽라인을 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);
}
}
댓글