UNITY_C#

[유데미x스나이퍼팩토리x웅진씽크빅]2회차_0913유니티(Unity) 10주 완성 프로젝트 캠프_기초 학습_미니게임만들기2

쫑나리 2023. 9. 13. 17:40
728x90
반응형
SMALL

*풀링에 대해 더 알아보기

중력을 받아 아래도 떨어지긴하지만 점프할때마다 떼굴 떼굴 굴러다니지 않도록  포지션에 y 빼고 모두 고정

before 이렇게 데굴데굴하던 아이가
after

캡쳐 순간이 아름답진 않지만 기존에 떼굴떼굴 돌던 아이가 이쁘게 그대로 떨어지고 있습니다. 성공

프리팹 이란

파일을 프리팹화 시켜두면 그대로 불러들여 재사용에 용이함, 

이 프로젝트에서는 벽을 계속 불러와야하고 플레이어가 그 벽 사이를 지나다녀야 하기 때문에

Wall이라는 오브젝트를 프리팹화 하기위해 Spawner를 Create Empty 해주고,

 

 

스크립트를 이렇게 작성해줍니다.

랜덤한 y값으로 벽을 만들어내는 스크립트도 함께 추가해주었습니다.

 

 

Wall.cs에 지나간 벽은 오브젝트에서 파괴되도록 Destroy를 넣어줌

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

public class Wall : MonoBehaviour
{
    public float speed = -5; // Use this for initialization

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(speed * Time.deltaTime, 0, 0);
        //명령이 한줄이면 중괄호 생략 가능
        if (transform.position.x < -10) Destroy(gameObject);
        
    }
}

 

생성과 삭제가 반복되는 것도 좋지 않을 수 있음

그 다음 필요한 오브젝트를 미리 생성해서 오브젝트 풀에서 그 오브젝트들을 관리하게 만드는 풀링이라는 것을 사용할 수도 있음

 

점수 나타내기

3d Odject - Legacy - TextMesh를 추가하여 Score라는 이름으로 바꿔 주었고, 위치와 크기도 조정

아래와 같은 크기와 위치입니다.

 

끄읏

 

마지막 중력 변경하기

edit - project Settings - Physics 에서 중력 값을 변경해 봅니다.

기본 중력 값은 지구의 중력 값인 -9.81로 되어 있지만

달의 중력 값이 1.62로 바꿔보았읍니다.

 

플레이 모습 비교 (모두 같은 조건의 중력만 다른 조건)

달ver

여기가 암스트롱이 왔던 행성맞나요?

지구ver

와타시는 몸무게가 조금 무거워져도 지구가 좋습니다... 지구야 사랑해

 

+ 점점 앞으로 가기와 점프부스터 설정하기

public class Player : MonoBehaviour
{
public float jumpPower = 5;
public float low = -4;
public float jumpBooster = 10;
public float speedUp = 1;
public float scaleUp = 0.5f;

    void Update()
    {
        transform.Translate(speedUp * Time.deltaTime, 0, 0);	//점점 앞으로 나가는 플레이어
        transform.localScale += new Vector3(0, scaleUp * Time.deltaTime, 0);	//키가 커지는 플레이어

        if (Input.GetButtonDown("Jump"))
        {
            if (transform.position.y < low)		//low보다 낮아지면 점프부스터
            {
                GetComponent<Rigidbody>().velocity = new Vector3(0, jumpBooster, 0);
            }
            else
            {
                GetComponent<Rigidbody>().velocity = new Vector3(0, jumpPower, 0);
            }
        }
    }
}

update 안에 앞으로 나아가기 위해 speedUp이라는 변수 만들어주었고,

Wall.cs에서 벽이 움직이는 deltaTime 문장을 가져와서 스피드업만 입혀주었고,

low라는 변수에 -4라고 정의해두고, 

포지션 y의 값이 -4 이하면 점프부스터를 받을 수 있도록 했습니다.

 

하지만 강사님께서 풀이해주신 코드는

ransform.position += new Vector3(speedUp * Time.deltaTime, 0, 0);

 

다양한 벽 만들기

프리팹화 되어있던 Wall을 하이라키로 끌고왔다.

파란색으로 표시가 되었고 이 것은 프리팹 Wall에서 수정이 되어도 이 Wall에 반영이 됨

하이라키 아래 Wall 에서 수정을 하면 프리팹 Wall에는 반영되지 않음

그리고 하이라키 아래있는 Wall은 함부로 지울 수도 없음 프리팹부터 지우라고함 (나중에 사용시 참고하세욤)

 

3가지 스타일의 Wall prepeb을 넣어줌

 

3가지 스타일 모두 잘 나옴

 

떨어지는 오브젝트 생성

Drop이라는 이름으로 실린더를 생성,

프리팹으로 넣어주었고, 위쪽에 위치하도록 배치 함

Spawner에서 사용할 수 있도록,

public GameObject dropPrefab;

 

public class Spawner : MonoBehaviour
{
    public GameObject[] wallPrefab;     //Wall 프리팹을 3개 넣어준 후 배열 형태로 바꿔줌
    
    public GameObject dropPrefab;
    
    public float interval = 1.5f;       //일정 시간마다 벽 생성 벽의 간격
    public float range = 3;     //벽의 높이 차이
    float term;

    // Start is called before the first frame update
    void Start()
    {
        term =interval;     //시작부터 벽이 하나 나오기 위해
    }

    // Update is called once per frame
    void Update()
    {
        term += Time.deltaTime;     //타이머의 기능
        if (term >= interval)       //일정 시간이 지나면
        {
            Vector3 pos = transform.position;       //여기서 Vector3는 지역변수이고, z,y,z 3가지 값을 갖는 변수
            pos.y += Random.Range(-range, range);   //y값으로 접근함, random.Range로 랜덤한 y값의 벽을 생성
            
            if (Random.Range(0, 2) == 0) // 50%의 확률로
                Instantiate(dropPrefab); // 떨어지는 장애물 생성
                
            int wallType = Random.Range(0, wallPrefab.Length);      //0부터 wallPrefab의 길이만큼 랜덤하게 인덱스로 출력
            Instantiate(wallPrefab[wallType], pos, transform.rotation);
            term -= interval;
        }
    }
}

            if (Random.Range(0, 2) == 0) // 50%의 확률로
                Instantiate(dropPrefab); // 떨어지는 장애물 생성 될 수 있도록 if문을 넣어주었습니다.

 

이렇게 하얀 분필같은 아이가 가끔 잘 떨어지는 것을 확인 했습니다.

 

이제 자유롭게 아이디어 추가하는 것이 과제 인것 같습니다만

이미 뭐든 많은 것 같아 고민 좀 해봐야겠네욤

728x90
반응형
LIST