장애물 파이프 만들기
파이프를 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라고 작성해줘야됨.