Development/Unity Engine

[Retro유니티] Player Object 설계 2 - GetComponent/linearVelocity/GetAxis 사용

사이바 미도리 2024. 11. 10. 20:32

몇 가지 문제를 개선하자.

1. AddForce를 통해 움직임을 구현한 탓에, 즉각적 방향전환이 안된다.

2. 입력감지코드가 복잡하다. if문 4개보다 더 간단히 하자.

3. playerRigidBody에 Component를 드래그&드롭으로 할당하는게 human-error에 취약하며 불편하다. 코드로 실행하고싶다.

 

1. Start() 메서드 수정

-> 드래그가 아니라, 코드상에서 RigidBody Component를 Object에 할당하기 위함.

private Rigidbody playerRigidBody;

로 선언하면, 더이상 드래그로 Component를 할당할 수 없다. Inspector 창에 public 아닌 변수는 표시되지 않기 때문이다.

 

  • GetComponent 메서드
    • 꺾쇠로 원하는 타입을 받는다. Component가 들어간다.
    • 원하는 Component를 자신의 Game Object에서 찾아온다.
    • 만약 Game Object에 찾으려는 Component가 없다면 null 반환한다.
public class PlayerController: MonoBehaviour
{
    private Rigidbody playerRigidBody;
    public float speed = 8f;
    void Start()
    {
        playerRigidBody = GetComponent<Rigidbody>();
    }

 

 

2. 조작감 개선하기

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

public class PlayerController: MonoBehaviour
{
    private Rigidbody playerRigidBody;
    public float speed = 8f;

    void Start()
    {
        playerRigidBody = GetComponent<Rigidbody>();
    }

    void Update()
    {
        float xInput = Input.GetAxis("Horizontal");
        float zInput = Input.GetAxis("Vertical");

        float xSpeed = xInput * speed;
        float zSpeed = zInput * speed;

        Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
        playerRigidBody.linearVelocity = newVelocity;
        
    }
    public void Die()
    {
        Debug.Log("Player died");
        gameObject.SetActive(false);
    }
}

 

 

  • Input.GetKey 대신 Input.GetAxis
    • WASD 및 방향키에 대응되는 값을 0, 1, -1로 리턴.
  • Vector3는 x,y,z 원소를 가진다.
  • AddForce가 아니라, velocity를 직접 수정하는걸로 바꾸었다.
    • Unity6에선 linearVelocity로 대체해야한다.

 

TMI) 입력매니저

- Keyboard라면 WASD, 화살표면 되지만, 조이스틱이라면 다른 입력치를 상하좌우에 Mapping 해야한다.