Development/Unity Engine

[Retro유니티] Player Object 설계 1 - AddForce를 통한 움직임 구현

사이바 미도리 2024. 11. 10. 16:27

1. Hierarchy창에서, 3D Object로 Player Object 생성

 

2. Project창에서, Material 로 Color 생성

 

 

3. Material 색 변경 및 Player에게 부여

 

- Camera Component의 Clear Flag를 변경하여 게임 변경색을 변경가능하다.

  - Clear Flag의 Skybox는 가상의 하늘을 그린다. Solid Color를 통해 단색으로 배경을 채울 수 있다.

 

 

4. 탄알 충돌 구현을 위해, Tag 설정

- 탄알입장에서, 충돌한 물체가 Player인지 단순GameObject인지 구분할 구분자가 필요.

- Tag는 Game Object를 분류하고, Code에서 Game Object를 구별하는데 사용된다.

- Code입장에서는, "탄알이 Player Tag를 가진 Object와 충돌했을 때"만 Game Over를 실행시키면 됨.


5. Player Object에 Rigid Body Component 추가

- 이동에는 물리적 힘과 속력이 필요.

- 물리적 상호작용이 가능하게 만들어주는 Component 추가가 필요함.

 

 

 

5-1. 오뚜기가 넘어지는걸 막기 위해, Constraints 추가

- 어떤 축의 위치/회전이 변경되지 않게 고정할 수 있음.

- x, z축은 회전불가능

- y축 선상에서는 이동불가능.

 

 

6. Player Script 생성.

-목표: 키보드입력감지 -> 이동하기

6-1. C# Script 생성

 

  • FPS
    • 보통 PC게임은 60FPS이다.
    • 다만 60FPS는 평균값일 뿐이고, 실제 FPS는 컴퓨터 성능에 따라 가변적이다.
    • Update() 메서드는 매 Frame마다 실행된다. 이 Frame의 주기는 컴퓨터 성능에 따라 가변적이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController: MonoBehaviour
{
    public Rigidbody playerRigidBody;
    public float speed = 8f;
    void Start()
    {
        
    }
    void Update()
    {
        if(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
        {
            playerRigidBody.AddForce(Vector3.forward * speed);
        }
        if(Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
        {
            playerRigidBody.AddForce(Vector3.back * speed);
        }
        if(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
        {
            playerRigidBody.AddForce(Vector3.left * speed);
        }
        if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
        {
            playerRigidBody.AddForce(Vector3.right * speed);
        }
    }
}

 

 

7. Die 메서드 추가

- PlayerController 스크립트가 스스로 실행하는 함수가 아님.

  - 탄알과 플레이어가 충돌시 실행.

  - 탄알과 플레이어가 충돌 시, 탄알이 Player Object의 Die 메서드를 실행한다.

    - 따라서, Die 함수는 public으로 선언되어야 한다.

  • gameObject 변수
    • Component 입장에서, 자신이 추가된 Game Object를 가리키는 변수.
      • Monobehaviour에서 제공한다.
    • 모든 Component는 gameObject 변수를 통해 자신을 사용중인 GameObject에 접근할 수 있다.
  • SetActive 메서드
    • 스스로 켜고 끄는 기능을 한다.
    • 비활성화된 게임 오브젝트는 씬에서 보이지 않게 된다.
    • Inspector창에서 아래 버튼과 효과가 동일하다. 체크해제시 씬에서 사라진다.

 

7-1. Script를 Object에 적용

 

8. RigidBody Component를 Script에 적용

 

- public Rigidbody playerRigidBody; 에 RigidBody Component를 할당시켜줘야, Object가 움직일 수 있다.

 

9. 동작확인

- 움직인다!

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

public class PlayerController: MonoBehaviour
{
    public Rigidbody playerRigidBody;
    public float speed = 8f;
    void Start()
    {
        
    }
    void Update()
    {
        if(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
        {
            playerRigidBody.AddForce(Vector3.forward * speed);
        }
        if(Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
        {
            playerRigidBody.AddForce(Vector3.back * speed);
        }
        if(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
        {
            playerRigidBody.AddForce(Vector3.left * speed);
        }
        if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
        {
            playerRigidBody.AddForce(Vector3.right * speed);
        }
    }
    public void Die()
    {
        Debug.Log("Player died");
        gameObject.SetActive(false);
    }
}