본문 바로가기

유니티/확장 프로젝트[3D]

3D 미니 프로젝트 0 ] 계획, 플레이어 생성

2D 독수리 잡기 게임 이후로 3D를 통하여 새로운 미니 프로젝트를 계획하였다.

 

점프 맵부터 시작하여 외부 파일들을 활용하여 다양한 기능들을 구현 해 보고, 애니메이션 등의 기능들 또한 구현하고, 무료 에셋들을 사용하여 게임다운 소소한 게임을 하나 만들어 보고자 한다.

 

우선 제작 계획부터 세워 보도록 하자.


점프맵

우선은 점프 맵 구성이다. 2D로는 플랫포머 게임과 같은 것이라고 보면 된다.

 

1. 이름 : 점프 게임

2. 목표 : 아이템을 먹으면서 골인하게 되어 높은 점수를 받는 것이 목표이다.

3. 결과 산정 요소 : 점수 (먹은 장애물 개수 * 장애물 별 가중치 - (최소 클리어 시간을 넘었을 시 초과한 시간))

4. 구현에 필요한 요소들 : Rigidbody, Collider, Rotate, Excel 관리 Asset (최고점수 등에 사용) 등등

 

점프 맵 이후에는 퀘스트를 받을 수 있는 RPG 형태의 게임 제작을 목표로 하고 있다.

 


플레이어 생성

 

기본적으로 플레이어 공과 발판으로 사용할 발판들을 만들어 준다.

 

플레이어 공

구 형태로 만들어 주었다.

Material로 넣은 이미지

이미지를 Material 형태로 구에 씌워 주었다.

 

구의 이동과 점프 기능을 넣은 코드 Move.cs이다.

 

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

public class Move : MonoBehaviour
{
    Rigidbody rigid;
    bool isJump; // 점프 여부 판단
    AudioSource item1;
    public int Score;

    float jumpForce = 60.0f;

    // Start is called before the first frame update
    void Awake()
    {
        item1 = GetComponent<AudioSource>();
        rigid = GetComponent<Rigidbody>();
        isJump = false;
        Score = 0;
    }


    void Update()
    {
        if (Input.GetButtonDown("Jump") && !isJump) // not 연산자를 사용한다. (Jump 상태가 아닐 때!)
        {
            rigid.AddForce(new Vector3(0, jumpForce, 0),ForceMode.Impulse);
            isJump = true; // 그런데 다시 false로 언제 만들어 줄까? -> 충돌!
        }
    }

      // Update is called once per frame
      void FixedUpdate()
      {

          float h = Input.GetAxisRaw("Horizontal"); // Raw 는 0,-1,1로 떨어진다.
          float v = Input.GetAxisRaw("Vertical");

          rigid.AddForce(new Vector3(h, 0, v),ForceMode.Impulse); // 3D에서 좌,우는 x축, 앞,뒤는 z축이다.



      }

      private void OnCollisionEnter(Collision collision)
      {
          // 바닥에 부딪혔을 때 점프 여부를 초기화 한다!

          if(collision.gameObject.tag == "base")
          {
              isJump = false;
          }
      }

      private void OnTriggerEnter(Collider other)
      {

          if (other.tag == "item1")
          {
              item1.Play();
          }

      }

  }

Input.GetAxisRaw를 통하여 수평, 수직 방향키를 입력받아 값을 이용한다.

 

그것을 이용하여 사방으로 힘을 받아 움직이게 하였으며, 점프는 Jump라는 이름으로 등록 된 키(Space Bar)를 이용하여 입력 받아 사용하였다.

 


카메라 설정

카메라는 플레이어를 따라다니게 만들고자 한다.

 

그런데 기존에 배틀그라운드, 마인크래프트와 같이 3인칭 방향으로 모든 방향을 볼 수 있게 하는 것 까지는 아니고 어느 정도의 거리를 떨어져서 전진할 수 있게끔 만들고자 한다.

(앞을 보는대로 카메가 각도 및 위치가 변하는 것은.. 사람 모양의 캐릭터를 사용할 때 사용하는 것이 좋을 것 같다.)

 

카메라 위치 세팅

 

카메라에 위와 같은 기능을 추가 해 주기 위해서는 카메라의 좌표와 플레이어의 좌표가 필요하다.

 

그 좌표들의 차이만큼을 offSet으로 만들어 주어 카메라의 위치에 LateUpdate로 적용시켜 주면 된다.

 

(UI, 카메라 등은 연산이 끝난 뒤에 LateUpdate를 통하여 갱신 해 주어야 한다.)

 

Camera.cs 코드

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

public class CameraMove : MonoBehaviour
{
    Transform playerTransform;
    Vector3 offSet;
    // Start is called before the first frame update
    void Start()
    {
        playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
        offSet = transform.position - playerTransform.position;
    }

    // Update is called once per frame
    void LateUpdate()
    {
        transform.position = playerTransform.position + offSet;
    }
}

 

실행 화면

실행 시 위와 같은 각도로 플레이어를 볼 수 있게 된다.