공부/Unity

[Unity] 이동을 처리하는 Addforce와 Velocity의 차이점 / Dodge 게임 툴 만들기

굴러다니다니 2023. 4. 26. 15:52
728x90

이동방식을 구현할 때 Addforce나 Velocity를 주로 사용한다.

둘의 차이가 뭘까

 

Addforce: 가해지는 힘을 누적하여 속도를 증가시키고, 이동 물리 질량 관성의 영향을 받는 메소드

Velocity: 속도를 나타내주는 변수이므로, 질량 관성은 무시하고 주어진 속도로 이동하는 이동변수

이다

확대는 못했지만 Velocity는 관성이 거의 없는 느낌으로 누르는만큼 딱딱 멈추지만, Addforce쪽은 마찰이 없는 것 처럼 슥슥 미끄러지는 영향을 많이 받은 상태를 확인할 수 있다.

 

Addforce를 사용한 코드는

if (Input.GetKey(KeyCode.W))
{
	Player_r.AddForce(0, 0, speed);
}
if (Input.GetKey(KeyCode.A))
{
	Player_r.AddForce(-speed, 0, 0);
}
if (Input.GetKey(KeyCode.S))
{
	Player_r.AddForce(0, 0, -speed);
}
if (Input.GetKey(KeyCode.D))
{
	Player_r.AddForce(speed, 0, 0);
}

로, 키의 입력을 받으면 그쪽 방향으로 speed를 addforce해주었다.

이러면 문제점이 최대값을 안정해두었기에 계속 값이 누적된다.

 

Velocity를 사용한 코드는

float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");

Vector3 value = new Vector3(x, 0, z) * speed;

Player_r.velocity = value;

를 사용했고, 움직이는 물체의 velocity값을 바꿔주는 식이다.

 

총알을 발사하는 bullet Spawner를 만들었다.

총구를 나타내기 위한 cube와 그 앞에 총알이 만들어질 포지션을 잡을 here empty object를 만들었다.

 

[SerializeField] private float rotateSpeed = 50.0f; //돌리는 속도
private Vector3 Direction = new Vector3(0, -1, 0); //돌리는 방향

 private void Update()
    {
        transform.Rotate(Direction, Time.deltaTime * rotateSpeed); 
    }

bullet Spawner에 위의 식을 넣어주면 계속 도는데, 부딪힌 벽이 너무 가까이 있으면 다시 반대 방향으로 돌게 만들었다.

 

		RaycastHit rayObject;
        if (Physics.Raycast(transform.position, transform.forward, out rayObject))
        {
            if (rayObject.transform.tag == "Wall" && rayObject.distance < 3.5f)
            {
                Direction.y *= -1;
            }
         }

raycasthit이 있고, 벽과 부딪혔으며 거리가 짧다면 direction의  y를 반대로 돌려 와리가리 도리도리 하게 만들었다,

 

총구가 플레이어를 향할 때 총알을 만드는 식을 코루틴으로 만들어보자.

if (rayObject.transform.tag == "Player" && !isFire)
            {
                isFire = true;
                StartCoroutine("coMakeBullet");
            }
IEnumerator coMakeBullet()
    {
        GameObject bullet = Instantiate(bulletPrefabs, here.position, transform.rotation);
        bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * bulletSpeed;
        Destroy(bullet, 3f);
        yield return new WaitForSeconds(0.5f);
        isFire = false;
    }

위에처럼 해두면 makeBullet 코루틴을 시작하고, 0.5초가 끝나기 전까지 isFire은 계속 true이고, 0.5초가 지난 후에는 isFire이 False가 되어 if문에 다시 들어가 총알을 발사할 수 있다.

히히

 

 

2D 3D 2.5D
Sort, Layer Z축  
원근 X 원근 O / X 가능 (Projection - Orthographic (X), Perspective (O))  

 

Raycast Collider

Rigidbody 불필요, Collider 필요 Rigidbody 필요, Collider 필요
레이저를 쏘고 닿는 물체를 검출 (움직이지 않아도 검출 가능, 두 개 같이 코스트 발생 X) 물체가 닿을 때 검출 (둘 중 하나가 움직여야 닿는다, 두 개 같이 코스트 발생)
728x90