[런게임] 유니티 3D로 러너 게임 만들기 - Runner, Skyline 만들기

|

Running

지금까지 아무것도 변한게 없어보입니다. 이제 본격적으로 게임을 만들어 봅시다. 이제 Runner을 오른쪽으로 이동시켜 봅시다.

Runner이름을 같는 C# 스크립트를 생성합니다. Runner 클래스는 Runner 폴더에 집어넣고 스크립트를 Runner 큐브에 붙입니다.. 아래코드를 작성하자.

using UnityEngine;

public class Runner : MonoBehaviour {

	void Update () {
		transform.Translate(5f * Time.deltaTime, 0f, 0f);
	}
}

play 버튼을 눌렀을때 약간의 문제가 있다. 이 camera는 cube를 따라가지 않는다. 이것을 고치려면 camera를 cube의 자식으로 놓는다.

지금은 Runner는 가만히 있고  skyline이 왼쪽으로 이동하는것 처럼보인다. 

Setup for moving camera.

Skyline을 생성하는 방법

우리는 기초적인 움직임을 배웠고, 이제는 skyline이 무한으로 생성되는 법을 배울것 입니다.  우리가 해야되는 첫번째 일은 skyline의 보이는 부분이 존재해야된다는 것입니다. 큐브가 왼쪽스크린으로 안보이게 되면 이것은 파괴하거나, 이것을 다시 skyline의 일부분으로 재사용할수도 있다.  우리는 큐브를 생성하는 방법과 뒤로 가서 더이상 보이지 않는 큐브를 앞으로 이동시키는 스크립트를 만들수 있습니다.

SkylineManager이름을 가지는 C# script를 Skyline 폴더에 만듭니다. 우리는 2개의 매니저 클래스를 만드는데,skyline 레이어에 각각 집어넣는다. 최소한, 프리팹을 사용할수 있게 skyline을 생성할수 있게 변수를 집어넣는다.

using UnityEngine;

public class SkylineManager : MonoBehaviour {

	public Transform prefab;
}

empty object를 생성한다 (GameObject / Create Empty) namedManagers의 이름으로 지정합니다. 또다른 empty object 를 생성합니다. Skyline Close Manager라고 , Managers의 하위 오브젝트로 설정하고SkylineManager 스크립트를 추가한다.

Now turn both skyline 큐브를  Skyline 폴더에 끌어당겨 프리팹을 만든다. 그후, Hierarchy에 있는 두개의 큐브를 삭제합니다. Skyline Close 프리팹을 Skyline Close Manager

에 집어넣습니다. 

Manager and prefabs.
우리는 큐브의 spawn 포인트(생성지점)를 만들어야 됩니다. startPosition변수를 만듭니다. 우리는 또한 화면에서 많은 큐브를 만들어야 됩니다. 간단하게 numberOfCubes의 변수를 만듭니다. nextPosition이라는 private 변수도 만듭니다.
	public Transform prefab;
	public int numberOfObjects;
	public Vector3 startPosition;

	private Vector3 nextPosition;

	void Start () {
		nextPosition = startPosition;
	}
다음 단계는 큐브를 초기화 하는 것이다. 우리는 간단하게 이것을 루프를 돌릴것이고, 왜냐하면 우리는 각각의 큐브가 unit으로 구성되기 때문에 거리느 그들의 localScale.x와 같다.
	void Start () {
		nextPosition = startPosition;
		for (int i = 0; i < numberOfObjects; i++) {
			Transform o = (Transform)Instantiate(prefab);
			o.localPosition = nextPosition;
			nextPosition.x += o.localScale.x;
		}
	}
현재 start 위치는 (0, -1, 0)으로 설정하고 Number of Objects 는 10으로 설정한다. 플레이 버튼을 누르면 runner밑에 간단한게 막대가 생성됩니다. 하지만 큐브는 화면밖으로 나가면 다시는 볼수 없습니다.
manager skyline
Instantiating a skyline.
Runner가 움직인 거리 만큼 recyle 시키는게 아이디어입니다. 이작업은, manager는 반드시 Runner의 움직인 거리를 알아야 되며   distanceTraveled 의 변수를  Runner 스크립트에 집어넣습니다.
using UnityEngine;

public class Runner : MonoBehaviour {

	public static float distanceTraveled;

	void Update () {
		transform.Translate(5f * Time.deltaTime, 0f, 0f);
		distanceTraveled = transform.localPosition.x;
	}
}
skyline 오브젝트에 queue를 집어넣고 재활용 해줍니다. recycleOffsetvariable 을 설정하고 10으로 설정한다.

큐란 무엇일까요?(자료구조) 바로가기

using UnityEngine;
using System.Collections.Generic;

public class SkylineManager : MonoBehaviour {

	public Transform prefab;
	public int numberOfObjects;
	public float recycleOffset;
	public Vector3 startPosition;

	private Vector3 nextPosition;
	private Queue<Transform> objectQueue;

	void Start () {
		objectQueue = new Queue<Transform>(numberOfObjects);
		nextPosition = startPosition;
		for (int i = 0; i < numberOfObjects; i++) {
			Transform o = (Transform)Instantiate(prefab);
			o.localPosition = nextPosition;
			nextPosition.x += o.localScale.x;
			objectQueue.Enqueue(o);
		}
	}

	void Update () {
		if (objectQueue.Peek().localPosition.x + recycleOffset < Runner.distanceTraveled) {
			Transform o = objectQueue.Dequeue();
			o.localPosition = nextPosition;
			nextPosition.x += o.localScale.x;
			objectQueue.Enqueue(o);
		}
	}
}
Recycling skyline configuration.

작업이 끝났다! 플레이 모드를 누르면 큐브는 다시 설정된다. 하지만 이것은 스카이라인처럼 보이지 않는다 좀더 스카이라인을 , 하지만 아직은 스카이 라인 처럼 보이지않는다. 좀더 스카인 라인처럼 보일려면, 이것을 재활용 시킬때 좀더 다양한 모양으로 만들어보자.

첫번째, 처음에 배치하는 큐브든 나중에 배치하는 규브든 모두 같은 것을 기본적으로 알자.아래 코드를 보자.

	void Start () {
		objectQueue = new Queue<Transform>(numberOfObjects);
		for (int i = 0; i < numberOfObjects; i++) {
			objectQueue.Enqueue((Transform)Instantiate(prefab));
		}
		nextPosition = startPosition;
		for (int i = 0; i < numberOfObjects; i++) {
			Recycle();
		}
	}

	void Update () {
		if (objectQueue.Peek().localPosition.x + recycleOffset < Runner.distanceTraveled) {
			Recycle();
		}
	}

	private void Recycle () {
		Transform o = objectQueue.Dequeue();
		o.localPosition = nextPosition;
		nextPosition.x += o.localScale.x;
		objectQueue.Enqueue(o);
	}
maximum 와 minimum 변수를 설정하고 랜덤으로 크기를 조정합니다.
	public Vector3 minSize, maxSize;

	private void Recycle () {
		Vector3 scale = new Vector3(
			Random.Range(minSize.x, maxSize.x),
			Random.Range(minSize.y, maxSize.y),
			Random.Range(minSize.z, maxSize.z));

		Vector3 position = nextPosition;
		position.x += scale.x * 0.5f;
		position.y += scale.y * 0.5f;

		Transform o = objectQueue.Dequeue();
		o.localScale = scale;
		o.localPosition = position;
		nextPosition.x += scale.x;
		objectQueue.Enqueue(o);
	}

Start Position (-60, -60, 50) 설정하고, Min Size 는 (10, 20, 10), Max Size는 (30, 60, 10)으로설정하고 , Recycle Offset to 60로 설정한다.

위와 마찬가지로 두번째 스카이라인을 만든다. Skyline Close Manager를 복사하고 이름을 Skyline Far Away Manager로 변경한다

Skyline Far Away prefab으로 변경한다. Start Position 을 (-100, -100, 100)으로 설정하고 Recycle Offset을 75로 설정한다, Min Size를 (10, 50, 10) 설정하고 Max Size를 (30, 100, 10)로 설정한다. 물론 너가 원하는 값으로 변경할수도있다.

managers skyline close manager skyline far away managerskylines
The complete skyline.


Trackback 0 And Comment 0

[런게임] 유니티 3D로 러너 게임 만들기 - 씬 설정하기

|

http://catlikecoding.com/unity/tutorials/runner/


개인 공부겸 번역 글입니다. 영어는 못하며 구글 번역기의 힘을 빌렸습니다.

Runner 최소한의 사이드 스크롤로 완성하기.





소개

이 튜토리얼에서는 간단한 무한 러너 게임을 만듭니다.

  • 배경 생성 방법
  • 오브젝트의 재사용
  • 간단한 물리 구현
  • 플레이어 점프 구현
  • 파워 업 구현
  • 간단한 매니저 클래스 만들기(게임을 관리할수있는 클래스)
  • 중력 조절
  • 간단한 GUI.

이 튜토리얼은 C# 과 유니티 에디터를 기본적으로 알고 있다는 가정하에 작성되었습니다.

 만약에 당신이 Clock 튜토리얼을 완성했다면 바로 시작해라. 그리고 Graphs 튜토리얼은 필수적이지는 않지만 봐두면 유용할 것입니다.

종종 기존의 코드는 생략하고 새로운 코드만 입력하게 되므로 문맥의 전후관계를 잘 보고

코드를 삽입하시기 바랍니다.

게임 

게임을 만들기 전 우리가 어떤 요소들을 게임에 집어넣을지 결정해야 됩니다. 우리는 간단한 2디 사이드 스크롤 게임을 만들기로 했지만 이것은 조금은 막연한 얘기입니다. 조금 더 구체적으로 얘기를 해볼까요?

게임 플레이어를 하는동안 플레이어는 오른쪽으로 계속 이동할 것입니다. 플레이어는 장애물과 장애물 사이를 점프 할수 있어야 되며. 이 장애물들은 각각 높이가 다를수 있으며 플레이어의 스피드를 느리게 할수도 있씁니다. 우리는 또한 파워업 아이템을 추가해서 속도를 빠르게 하거나 점프를 높게 할수 도 있습니다.

그래픽은 간단한게 큐브를 사용할것이며 간단한 파티클도 들어갑니다. 이 큐브는 runner와 파워업 아이템 그리고 장애물 하늘 배경에도 사용됩니다. 파티클 시스템은 주인공이 지나간 흔적을 나타네거나 물체가 떨어지거나 올라갈때 효과를 넣어줍니다. 그리고 우리는 음악을 사용하지 않습니다.

Scene 설정하기

새로운 프로젝트를 생성합니다(file-new project). 기본적을 2 by 3 에디터 레이아웃이지만 당신이 원한다면 당신이 편한 레이아웃으로 설정해도 됩니다. 게임뷰에 비율을 16:10 으로 맞춥니다.

우리의 게임은 기본적으로 2D이지만 , 약간의 3D 적인 느낌도 표현하려고 합니다.

 orthographic 카메라는 3D를 표현할수 없으므로, perspective 카메라를 . 이 방법을 사용하여 다양한 거리에서 다층 스크롤을 사용할 수 있습니다.  foreground 의 깊이는 0, background 깊이는 50, 그리고 다른것들은 100으로 설정합니다. 3개의 큐브를 사용하고 배치하는 가이드를 작성해 보겠습니다. 저는 제가 원하는 각도및 색 설정을 사용했지만 당신은 자유롭게 다른것의로 바꿔서 할수도 있습니다.

 directional light (GameObject / Create Other / Directional Light) 를 더하고 rotation (20, 330, 0)을 설정합니다. directional light 오른쪽 어깨너머로 광원이 빛추는 효과를 나타낼수 있습니다. directional light은 위치는 중요하지 않습니다.(영향없음)

Main Camera  의 Field of Viewf를 30으로 맞추고, position (5, 15, -40) 설정, 그리고 rotate(20, 0, 0) 설정합니다. 또한 백그라운드 색상을 (120, 180, 250)로 설정합니다.
























light camera
Light and camera.

3개의 cube를 만들자 (GameObject / Create Other / Cube) Z 값들은 각각 0, 50,100이다. RunnerSkyline Close, Skyline Far Away 라고 이름을 지정해주자. skyline 큐브들은 콜라이더를 삭제하자.

material을 생성하자. 이름은 Runner Mat 그리고 마찬가지로 다른것들도 Mat이라고 생성한다. 그리고 이것들을 각각의 큐브에 드래그 한다. 나는 기본적인 칼라인 하얀색과 (100, 120, 220), 그리고 (110, 140, 220) 이것을 사용했다..

runner
skyline close skyline far away
The three cube configurations.
Runner 와 Skyline 폴더를 만들고 각각의 materials을 폴더에 집어넣자.
projectgame scene
Hierarchy, project, and game views.








Trackback 0 And Comment 0

[함수] 유니티 함수 Vector3.Lerp에 대해서 알아보자.

|

using UnityEngine;

using System.Collections;

 

public class LerpTest : MonoBehaviour {

    //시작위치 위치

    public Transform startMarker;

    public Transform endMarker;

 

    public float speed = 10.0F;

    private float startTime;

    private float journeyLength;

    void Start()

    {

        startTime = Time.time;

        journeyLength = Vector3.Distance(startMarker.position, endMarker.position);//시작과끝 위치 거리

    }

    void Update()

    {

        //두점 사이의 거리가 10일때

        float distCovered = (Time.time - startTime) * speed; //속력 v = m/s 1초에 10움직임 한프레임당 1움직인다고하면

        float fracJourney = distCovered / journeyLength;// 속력 / 길이 = m/s / m = 1/s 시간 fracJourney = 0.1f

        transform.position = Vector3.Lerp(startMarker.position, endMarker.position, fracJourney); //

    }

}


유니티 함수 Lerp에 대해서 알아봅시다.


Lerp는 두 벡터 사이에 시간에 따른 위치를 구하는 함수입니다.

만약 startMarker position 은 (-5,0,0 )이고 endMarker 은 (5,0,0) 일때

위의 fracJourney 가 0.5초 일때 정확히 0,0,0 을 반환하게 되며, 0.1초 일때는 두점 사이의 거리가 10이므로 1,0,0 값을 반환 하게 됩니다.

fracJourncey 가 1.0f 일때나 그 이상일때는 endMarker 의 위치(5,0,0)를 반환합니다.

만약 0.0f이거나 그 이하일때는 startMarker의 위치(-5,0,0)를 반환하게 됩니다.



Trackback 0 And Comment 0