Unity

장애물 파이프 만들기

코딩 화이팅 2023. 10. 17. 15:01

파이프를 scene에 올리기

물체를 위 아래로 회전시키고 싶다면, 회전시키고 싶은 물체를 누르고 Position의 z축을 180도로 설정해둠. 두 개의 파이프를 하나의 물체로 그룹화 시키고 싶다면 Create Empty를 누르고 빈 하나의 객체를 만들어, 거기에 추가하고 싶은 물체들을 드래그 앤 드랍한다. 

Pipe를 동시에 움직이고 싶다면 Pipe를 클릭하고 inspector의 x,y,z를 클릭하여 왼쪽 오른쪽으로 조절하면 동시에 움직일 수 있다. 

여기서 새로운 Component를 추가하여 자동으로 파이프가 왼쪽으로 움직이도록 하려면

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

public class Move : MonoBehaviour
{
    public float speed;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += Vector3.left*speed*Time.deltaTime;
        //transform: 이건 바로 들고올 수 있다.
        //Vector3.left : (-1, 0, 0)
        //Time.deltaTime : 지난 프레임이 완료되는데까지 걸린 시간(FPS 보정용으로 사용)
    }
}

새로운 컴포넌트를 만들고 코드를 이렇게 작성해주고 동작을 누르면 기둥이 자동으로 움직이게 된다. 하지만 지금은 기둥을 뚫고 계속해서 새가 뒤로 가기 때문에 새가 파이프에 부딪히면 앞으로 못 가도록 하기 위해, 2개의 파이프에 Box Collider 2D Component를 추가해준다. 그럼 파이프를 통과 못하고 파이프에 부딪히게 된다.

Prefab

한 오브젝트가 여러번 쓰일 일이 많을 때 Prefab을 만들어두고 이 등록된 Prefab을 여러번 사용 가능하다.

따라서 이 파이프를 하나의 Prefab으로 설정해두고 여러번 찍어내면 같은 파이프가 계속해서 나오도록 설정할 수 있다.

Prefab을 만들려면 SampleScene이라고 적힌 App단의 가장 큰 폴더를 Assets에 드래그앤 드랍하면 Pipe라는 Prefab으로 등록이 된다.

 

이제 파이프를 계속 만들어주려면 하나의 Hierarchy를 생성하고 계속해서 생기게 하는 Component를 추가하고 코드를 작성한다.

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

public class MakePipe : MonoBehaviour
{
    public GameObject pipe;
    //GameObject를 하나 정해서 거기에 pipe를 넣어주기 위해 GameObject의 pipe라는 이름으로 만들어준다.
    float timer = 0;
    public float timeDiff;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        timer+=Time.deltaTime;
        if (timer>timeDiff)
        {
        GameObject newpipe = Instantiate(pipe);
            newpipe.transform.position=new Vector3 (0.53f,Random.Range(-3.0f,5.0f),0);
            timer = 0;
            Destroy(newpipe, 10.0f);
        }
    }
}

public GameObject pipe;에서 Pipe안에 생성한 pipe라는 hierarchy를 넣어 어떤 걸 계속 생성할 지 넣을 수 있다.

여기 이 Pipe안에 Assets안에 이미 들어있는 pipe를 드래그앤 드랍해준다.

몇 초마다 파이프가 생기도록 해주기

float timer = 0;
public float timeDiff;
timer+=Time.deltaTime;
if (timer>timeDiff)
{
GameObject newpipe = Instantiate(pipe);
    timer = 0;
}

timeDiff를 public으로 설정해줘서 유니티 내에서도 조절이 가능하도록 해준다. timer에 deltaTime만큼 시간을 더해가며 1이 넘어갔을 때 파이프를 나오도록 하고 타이머를 0으로 설정해줘서 그 시간이 지나면 파이프가 나오도록 설정을 해준다.

위치를 랜덤으로 해서 파이프가 생기도록 해주기

newpipe.transform.position=new Vector3 (0.53f,Random.Range(-3.0f,5.0f),0);

x축의 처음 좌표위치, y축의 랜덤 위치 Range(랜덤 시킬 처음 수치, 랜덤시킬 마지막 수치),z축의 처음 위치)

Override 시켜주기

지금 코딩하는 건 hierarchy를 변경해주는 것이기 때문에, 이걸 계속해서 만들어주는 건 Prefab을 사용하여 만들어주는 것이기 때문에 같은 것이지만 처음에 반영된 Prefab로만 만들어진다. 고로 이걸 다 반영시켜주기 위해 Overrride를 시켜줘야함 / Override-> Apply all

Pipe 없애주기

지금 파이프가 생성되고 삭제되지 않아 계속해서 파이프가 쌓이는데 이렇게 되면 메모리적 손해가 계속해서 쌓여서 없애주는게 효율적일 것이다. 

Destroy(newpipe, 10.0f);

파이프를 없애주는데, 10초 뒤에 없애준다. float형으로 적어야하기 때문에 10.0f라고 작성해줘야됨.