본문 바로가기

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

3D 미니 프로젝트 1 ] 플레이어 이동, 스테이지 기초 세팅

지난 포스팅에서는 프로젝트 전체에 대한 큰 계획을 세우고 플레이어 생성 및 카메라 세팅까지 진행하였다.

 

이번에는 해당 프로젝트 파일이 손상된 관계로 다시 프로젝트를 생성하였기에 플레이어의 스킨이 달라졌다.

 

플레이어

이번 프로젝트에서는 Polygon Starter Pack을 사용하였다.

Polygon Starter Pack

 

RigidBody 설정

우선, 플레이어에게 RigidBody를 설정 해 주고 Mass를 10으로 설정 해 준다.

 

그리고 발판을 하나 가져와서 테스트를 해 보면 공이 잘 움직이지만 발판이 미끄러울 것이다.

 

physic material 생성

Assets에서 마우스 오른쪽을 눌러서 Physic Material을 생성 해 준다.

 

여기서 마찰력, 탄성력 등을 설정할 수 있다.

 

마찰력 설정

마찰력을 좀 과하다 싶게 설정 해 주어야 잘 미끄러지지 않는다. (테스트를 통하여 최적의 값을 찾아 내 보도록 하자)

 

그리고 Material을 적용 할 발판에 드래그 앤 드랍 해 주면 적용된다.

 

마찰력 테스트

발판들을 새로 생성 해 준 다음,  마찰력을 적용하고 테스트를 해 주면 위 움짤과 같이 브레이크가 잘 걸림을 볼 수 있다.


다시 한 번 점프 게임의 목적을 상기시켜 보자

 

바로, 발판을 밟으면서 최종 골인 지점까지 도달하는 것이다.

 

그러면 발판에 안착하지 못해 떨어졌을 때는 어떻게 할까? 알아서 있던 지점까지 돌아가야 하는건가?

 

보통 다른 게임들을 보더라도 자동으로 시작지점 또는 세이브 지점으로 이동시켜 준다는 것을 기억 할 것이다.

 

따라서 아래 있는 빨간색 발판에 닿았을 때, 시작 지점으로 이동시켜 주게끔 해 보자.

 

플레이어 내부 코드에서 이동시키게끔 해도 좋을 것 같지만 스테이지를 주관하는 Manager가 이동시키는 방식을 사용 해 보도록 하자.

 

플레이어가 떨어져서 이동할 때는 UI를 같이 출력 해 주는 것이 좋은데 Prefab이 될 Player는 UI를 다루는 것이 별로 좋지 않기에 Manager에서 이동까지 주관하는 것이 좋을 것이라 생각했다.

 

코드를 수정하면 아래와 같이 된다.

 

Player.cs

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

public class Player : MonoBehaviour
{
    GameObject manager;
    Managing managing;
    Rigidbody rigid;

    bool isJumpState = false;
    bool SavePointOneEnabled = false;

    Vector3 ReturnPos = new Vector3(1,1,-18); // 세이브 포인트를 먹지 않았을 때 돌아 갈 지점
    float jumpForce = 60.0f;
    
    // Start is called before the first frame update
    void Start()
    {
        rigid = GetComponent();

        manager = GameObject.FindGameObjectWithTag("Manager");
        managing = manager.GetComponent();

    }

    private void Update()
    {
        if (Input.GetButtonDown("Jump") && !isJumpState)
        {
            isJumpState = true;
            rigid.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }

    }


    // Update is called once per frame
    void FixedUpdate()
    {
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");

        rigid.AddForce(new Vector3(h, 0, v), ForceMode.Impulse);

    }

    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "base")
        {
            isJumpState = false;
        }
        else if(collision.gameObject.tag == "under")
        {
            if (!SavePointOneEnabled)
            {
                rigid.velocity = Vector3.zero;
                managing.MoveToTarget(ReturnPos);
            }

        }
    }

}

세이브 포인트에 도달했는지 여부를 묻는 bool 변수도 넣어 주었으며, 세이브 포인트에 도달하지 못했다면 시작 지점으로 돌아가는 함수를 호출한다.

 

 

Managing.cs

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

public class Managing : MonoBehaviour
{

    GameObject player;

    // Start is called before the first frame update
    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
    }

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

    public void MoveToTarget(Vector3 target)
    {
        // 플레이어를 타겟으로 이동시키는 함수
        player.transform.position = target;
    }

}

 

그러면 이제 초록색 발판에서 떨어지게 되면 다시 시작 지점으로 이동하게 될 것이다.


이제, 1 스테이지 전반에 대한 발판들을 세팅 해 보도록 하자.