'분류 전체보기'에 해당되는 글 495건

  1. 2014.01.13 [런게임] 유니티 3D로 러너 게임 만들기 - 게임 이벤트들
  2. 2014.01.13 [런게임] 유니티 3D로 러너 게임 만들기 - 길의 종류
  3. 2014.01.13 [런게임] 유니티 3D로 러너 게임 만들기 - 점프와 점프 실패
  4. 2014.01.13 [런게임] 유니티 3D로 러너 게임 만들기 - 플랫폼(길) 생성하기
  5. 2014.01.12 [queue] Queue 관련 함수 (Dequeue, Enqueue, Peek)
  6. 2014.01.12 [런게임] 유니티 3D로 러너 게임 만들기 - Runner, Skyline 만들기
  7. 2014.01.12 [런게임] 유니티 3D로 러너 게임 만들기 - 씬 설정하기
  8. 2014.01.12 [함수] 유니티 함수 Vector3.Lerp에 대해서 알아보자.
  9. 2014.01.12 [잡담] 어둠속을 헤매는 초보분들을 위해 ~
  10. 2014.01.10 추상 클래스 (C++)

[런게임] 유니티 3D로 러너 게임 만들기 - 게임 이벤트들

|

게임 관련 이벤트들

현재 게임은 플레이 버튼을 누르면 즉시 실행되며, 플레이어가 길 아래로 추락해도 게임이 끝나지도 않습니다. 우리가 원하는 것은 게임 타이틀 화면으로 시작하고 점프 버튼 중 하나를 누르면 새로운 게임을 시작 한다는 말과 함께 플레이어가 죽으면 게임이 끝나는 것입니다

위와 같은 방법을 구현하기 위해서는 세가지 이벤트들을 구현해야 됩니다. 첫번째는 게임 실행시 Start 메서드에서 구현합니다. 나머지 두가지는 게임 시작과 게임오버인데 이것은 사용자 정의 방식을 필요로합니다. 우리는 이것들을 관리하기 위해서 간단한 이벤트 매니저를 생성할것입니다.

Managers 폴더를 만듭니다.그리고 GameEventManager라는 C# 스크립트를 생성합니다. 우리는 GameEventManager 를 스테틱 클래스로 만들것이고 이안에 GameEvent 딜리게이트를 집어넣을것입니다. manager 클래스는 MonoBehaviour 를 상속받지 않으며 오브젝트에도 붙지 않습니다.

 C# 딜리게이트와 이벤트란?
Game event manager.
public static class GameEventManager {

	public delegate void GameEvent();
}
우리는 새로운 gameEvent 타입을 사용합니다. manager 에 두가지 타입을 더합시다. GameStart 와 GameEnd. 이제 다른 스크립트에서 이벤트를 구독하여 이벤트를 호출 할수있습니다.
public static class GameEventManager {

	public delegate void GameEvent();

	public static event GameEvent GameStart, GameOver;
}
마지막으로, 우리는 이벤트를 변환 할 수있는 방법을 추가해야합니다. 우리는 두 가지 메서드를 추가합니다. 이벤트를 호출하는 경우 구독을 하지 않으면 null이됩니다. 그럴 경우 오류가 나므로 주의하시기 바랍니다.
public static class GameEventManager {

	public delegate void GameEvent();

	public static event GameEvent GameStart, GameOver;

	public static void TriggerGameStart(){
		if(GameStart != null){
			GameStart();
		}
	}

	public static void TriggerGameOver(){
		if(GameOver != null){
			GameOver();
		}
	}
}


Trackback 0 And Comment 0

[런게임] 유니티 3D로 러너 게임 만들기 - 길의 종류

|

길의 종류

게임을 좀더 재미있게 하기 위해서 두가지 길을 더 추가 하겠습니다. 한가지 길은 Runner이 길 위에 있을시 속도가 느려지는 것이고 나머지 하나는 속도가 빨라지는 것 입니다. 우리는 두가지 physic materials을 만들고 두가지 색상을 만듭니다 그리고 길에 랜덤하게 이것을 사용합니다. 

Platform Regular PMat 2번 복사합니다. 이름을 Platform Slowdown PMat, 그리고 Platform Speedup PMat이라고 설정합니다. 또한 비슷한 방식으로 Platform Regular Mat를 두번 복제하고 이름을 지읍시다. friction값을 0.15 그리고 0으로 설정하고, 색상은  (255, 255, 0) 그리고 (60, 130, 255)으로 설정합니다.

slowdown physic material speedup physic material 
slowdown material speedup material 
hierarchy
Slowdown and speedup platforms.
우리는 이제  PlatformManager 를 수정할것입니다. 우리는 두가지 배열을 더해서 랜덤하게 위에서 설정한 깂들을 사용할 것입니다.
	public Material[] materials;
	public PhysicMaterial[] physicMaterials;

	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;
		int materialIndex = Random.Range(0, materials.Length);
		o.renderer.material = materials[materialIndex];
		o.collider.material = physicMaterials[materialIndex];
		objectQueue.Enqueue(o);

		nextPosition += new Vector3(
			Random.Range(minGap.x, maxGap.x) + scale.x,
			Random.Range(minGap.y, maxGap.y),
			Random.Range(minGap.z, maxGap.z));

		if(nextPosition.y < minY){
			nextPosition.y = minY + maxGap.y;
		}
		else if(nextPosition.y > maxY){
			nextPosition.y = maxY - maxGap.y;
		}
	}
}
위에서 설정한 값을들 Platform Manager 에 할당합시다. 우리는 어떤한 길 유형을 더하려고 할 경우, 단순히 여러 번 이렇게 드래그해서 더하면 됩니다. 아래와 같이 설정하면 일반 속성같은 경우 50퍼 센트 확률로 발생되고 나머지 속성같은경우 25퍼선테 확률로 발생됩니다.
settingsgame
Platform variety.


Trackback 0 And Comment 0

[런게임] 유니티 3D로 러너 게임 만들기 - 점프와 점프 실패

|

점프와 점프 실패

우리는 길을 가지고 있다, 우리는 이 게임을 좀더 업그레이드 할수있다. 우리는 유니티의 물리 엔진을 사용하여 점프를 구현할 것이다. 점프와 떨어지는 것을 구현할려면 콜라이더가 필요하다.  Rigidbody 컴포넌트를 Runner 에 추가하자(Component / Physics / Rigidbody). 우리는 특정방향으로 회전하거나 이동하는것을 원하지 않으므로, constrain 값을 freezing Z position 과모든 rotation axes에 체크하자.

길위를 움직일때 어떠한 physic material 이 일어납니다.  physic material 을 생성하고 모든 필드를 0으로 설정하고 combine options은 둘다 max로 설정합니다.

Runner PMat를 Runner folder 폴더에 넣고, Runner의 박스 콜라이더에 집어넣는다.

Runner 의 위치를 (0, 2, 0)로 설정하고 길 위로 떨어트린다. 그리고 플레이 버튼을 눌러서 어떤일이 일어나는지 봐라!

runner materialgame
Runner with physics.

Runner는 오른쪽으로 이동하다 보면 구멍에 떨어지게 됩니다. 길을 빠르게 지나가도 다시 떨어지게 되있습니다. 하지만 길의 옆면에 충돌이 발생할 경우 이상한 일이 일어납니다. 

Update

함수에서 위치를 변경하기 때문입니다. 우리는 물리엔진을 그대로 두고 forces를 적용해야 됩니다.

Update 에서  Translate 을 부르는걸 제거합니다((Runner 스크립트). 대신에 우리는 유니티 collision  이벤트 메서드를 부릅니다(OnCollisionEnter ,OnCollisionExit ) – 길위에 부딪히거나 떨어질때 호출됩니다. 길위에 터치되면 우리는 가속도가 적용되어 속도가 빨라집니다.

acceleration를 5로 설정합시다.

using UnityEngine;

public class Runner : MonoBehaviour {

	public static float distanceTraveled;

	public float acceleration;

	private bool touchingPlatform;

	void Update () {
		distanceTraveled = transform.localPosition.x;
	}

	void FixedUpdate () {
		if(touchingPlatform){
			rigidbody.AddForce(acceleration, 0f, 0f, ForceMode.Acceleration);
		}
	}

	void OnCollisionEnter () {
		touchingPlatform = true;
	}

	void OnCollisionExit () {
		touchingPlatform = false;
	}
}

이 작업을 하기 전에 한가지 더 할 일이 있습니다. Runner PMat을 복사하고, Platform Regular PMat이라고 지정해서  Platform 폴더에 집어넣습니다. friction 값은 0.05로 설정하고 physic material을 Platform prefab에 드래그합니다.

우리의 길은 약간의 마찰력을  제공하지만 Runner은 움직일수 있는 충분한 가속도가 있습니다.

acceleration platformphysic material
Acceleration and regular platform.
Runner의 점프를 만들어 봅시다.  우리는 플레이어에 input을 붙여야 됩니다. Unity는 기본적으로 점프 액션이 세팅 되어있습니다. Edit / Project Settings / Input 에서 찾을수 있으며, 스페이스바를 누르면 작동 됩니다. 우리는 이것을 사용할 것이며, Alt Positive Button 필드에 x를 집어넣습니다.
Jump input configuration.
Runner

 에 점프 관련 변수를 더합니다. 우리는 수평과 수직을 조작할수 있도록 float대신 Vector3 클래스를 사용할 예정입니다. 필드의 값을 (1, 7, 0)로 설정합니다.

  Update 함수에 아래 내용을 추가하면 Runner이 점프버튼을 누를시 점프하게 될 것입니다.

	public Vector3 jumpVelocity;

	void Update () {
		if(touchingPlatform && Input.GetButtonDown("Jump")){
			rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange);
		}
		distanceTraveled = transform.localPosition.x;
	}
settings game
Runner jumping.
우리는 점프를 할수있습니다! 하지만, 만약 길의 양 옆에 위치하게 되면(길과 계속 터치하고 있으면) 여러번 점프가 가능합니다. 이것을 막으려면 아래 코드를 추가합니다.
	void Update () {
		if(touchingPlatform && Input.GetButtonDown("Jump")){
			rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange);
			touchingPlatform = false;

} distanceTraveled = transform.localPosition.x; }


Trackback 0 And Comment 0

[런게임] 유니티 3D로 러너 게임 만들기 - 플랫폼(길) 생성하기

|

길 생성하기

길을 생성하는 방법은 스카이라인을 생성하는 방법에서 약간만 다르다. 길은 길과 길 사이의 거리와 높이가 랜덤하게 배치된다. 또한 우리는 스카이라인이 보이게 길의 위치나 고도를 제한할 필욛 있다. 만약 길이 화면 밖에 있으면 우리는 그것을 다시 사용 해야 된다.

Platform이라는 폴더를 생성한다PlatformManager라는 C# script를 생성한다 . 그리고 SkylineManager 코드를 복사한다. 그리고 아래처럼 몇개의 코드만 고친다.

using UnityEngine;
using System.Collections.Generic;

public class PlatformManager : MonoBehaviour {

	public Transform prefab;
	public int numberOfObjects;
	public float recycleOffset;
	public Vector3 startPosition;
	public Vector3 minSize, maxSize, minGap, maxGap;
	public float minY, maxY;

	private Vector3 nextPosition;
	private Queue<Transform> objectQueue;

	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 () {
		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;
		objectQueue.Enqueue(o);

		nextPosition += new Vector3(
			Random.Range(minGap.x, maxGap.x) + scale.x,
			Random.Range(minGap.y, maxGap.y),
			Random.Range(minGap.z, maxGap.z));

		if(nextPosition.y < minY){
			nextPosition.y = minY + maxGap.y;
		}
		else if(nextPosition.y > maxY){
			nextPosition.y = maxY - maxGap.y;
		}
	}
}
이제 platforms 프리팹을 만들고, material 도 만들어보자.  skyline materials을 복사해서 칼라값만 (255, 60, 255)로 변경할수있다. Platform Regular Mat으로 변경하자. 새로운 cube를 만들고, materials을 붙이고 프리팹으로 만든다. 이름은 Platform으로 지정한다. 프리팹과 메트리얼은 Platform 폴더에 집어넣는다.
Platform prefab.
Platform Manager 이라는 빈 게임오브젝트를 만들고 Managers의 자식으로 놓아둔다.  Platform Manager 컴포넌트에 스크립트를 붙인다. 프리팹에 Platform prefab을 연결하고 Number Of Objects은 6으로 설정한다.  Recycle Offset 은 20으로 설정하고, Start Position 은 (0, 0, 0), Min Size 은 (5, 1, 1), Max Size 는 (10, 1, 1)으로 설정한다. 그리고 새로운 필드인 Min GapMax Gap,Min Y, 그리고 Max Y  는 각 각 (2, -1.5, 0), (4, 1.5, 0), -5, 그리고 10 으로 설정한다. 다시 말하지만 원한다면 니가 원하는 숫자로 설정할수있다.
platform manager managers
Platform manager.


Trackback 0 And Comment 0

[queue] Queue 관련 함수 (Dequeue, Enqueue, Peek)

|


Queue.Dequeue 메서드

Queue 의 시작 부분에서 개체를 제거하고 반환합니다.









Queue.Enqueue 메서드

개체를 Queue의 끝 부분에 추가합니다.





Queue.Peek 메서드
Queue 의 시작 부분에서 개체를 제거하지 않고 반환합니다.



Trackback 0 And Comment 0

[런게임] 유니티 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

[잡담] 어둠속을 헤매는 초보분들을 위해 ~

|

출처 : http://cafe.naver.com/unityhub


프로그래밍을 처음부터 어떻게 공부해야 하는지 난감하기만하신 분들에게

조금이나마 도움이 될까해서 저의 경험들을 떠올리면서 몇 자 적어봅니다.

 

국민학교를 다닐 때 베이직을 수박겉핥기 수준으로 배우고, 컴퓨터는 오로지

오락기쯤으로 여겼던 제가 컴퓨터 학원을 다녔던 이유도 게임을 하기 위해서 였습니다.

 

그렇게 컴퓨터를 뜯었다 고쳤다 컴퓨터를 가지고 노는 데에만 미쳐있던 제가

17살 때 부터 본격적으로 C언어를 공부하기 시작한 이유는 조금은 황당합니다.

 

그날도 마찬가지로 컴퓨터를 가지고 놀다 어디선가 복사해 온 테트리스를 실행시켰는데

"만든이> 포항공대 김개똥!!" 이라고 적혀있는 겁니다.

저는 그런 대단한 프로그램은 특별한 기업에서만 만들어 내는 줄 알았지 사람?이

만들었다는건 생각도 못했습니다.

 

게임을 만드는 회사도 결국 사람이 일하는것이 분명했을 터인데 철없고, 무식했던 저에게

대학생이 게임을 만들었다는것이 엄청난 충격이 아닐 수 없었습니다.

 

그 때 친누나가 대학을 다니고 있었기 때문에 그런 누나(컴맹)와 친구?같은 사람이 이렇게 깔끔하고

멋진 테트리스를 만들었다는 말이야?하고 머리를 큰 헤머로 맞은듯 나도 맨날 납땜질만 할게 아니라

소프트웨어를 만들어야 겠구나 하고 마음을 먹었습니다.

 

그러고는 자취방 주변에 있던 컴퓨터 학원을 다짜고짜 찾아갔습니다.

학원을 두리번 거리던 저에게 수업을 하시던 선생님들이 나오셔서 무슨 용무냐고 물으시길래

제 상황을 설명드리고, "어떤 언어가 가장 좋은지? 개발툴이 있으면 복사해주시고, 책도 빌려주세요!"라고

다소 황당하게 말했습니다.

 

그 학원 선생님들은 참으로 고맙게도 "그럼 학원을 다니세요"라 하지는 않고, C언어가 지금은 가장 좋은것

같다. 그리고 Turbo-C 컴파일러와 "C언어 500예제"라는 책을 누군지도 모르는 저에게 빌려주셨습니다.

 

[Turbo-C 컴파일러]

 

집에 가서 위에 보이는 터보씨를 실행해보니 오류만 뜨고, 아무런 동작을 하지 않길래 또 찾아갔더니 

이번에는 그 여 선생님의 남편이 오셔서 문제를 해결해 주셨습니다.

(그 여 선생님은 신혼이셨는지 다른 회사에 근무하던 남편이 땀을 뻘뻘 흘리면서 학원에 도착했을 때

그 남편을 바라보던 눈빛이 아직도 기억납니다. 뭐라고 말하진 않아도 사랑이 철철 넘쳐 흐른다고 해야하나요. ^^

지금은 40~50정도 되셨을 그분들이 혹시나 이글을 보신다면 정말 다시 만나뵙고 싶습니다. ㅠㅠ

부산 동래구 온천장 부근의 금정 컴퓨터 학원이었던가? 네티즌 수사대님들 제발 찾아주셔요.)

 

어쨌거나 문제는 해결되었고, 집으로 돌아가 "Hello world" 예제를 실행했더니

내 눈 앞에 "Hello world.exe"라는 파일이 만들어 지고야 말았습니다.

그 날 저는 잠을 잘 수 없을 정도로 큰 기쁨을 느꼈고, 빌려주신 프로그래밍 500예제는 제가 만져 본 책 중에서는

가장 두꺼웠는데도 일주일만에 모두 다 읽었습니다.

 

처음에는 이해고 뭐고 없었습니다. 그냥 책을 읽고, 예제를 그대로 따라 타이핑 해보고, 실행되는 모습에 감탄하고...

지금 생각해보면 정말 별것 아닌 그런것이 저에게는 판타지 소설책을 읽는 기분이었습니다.

 

이 처럼 프로그래밍에 재미만 붙일 수 있다면 프로그래머가 되는것은 시간문제일 뿐입니다.

지금 부터는 제가 프로그래밍을 처음 하면서 고민했던것에 대한 효과적인 학습방법들을 설명하도록 하겠습니다.

 

 

 

 

 

첫째. 처음 이해가 안될때는 무조건 보고해라 (Copy and paste)

-------------------------------------------------------------------------------------------------

코딩을 하면서 책을 보거나 인터넷을 뒤져보는것을 초보라 생각하는 사람들이 있습니다.

절대 그렇지 않습니다. 제가 배울때는 딱히 적어둘곳이 없어서 수첩에다 일일이 적었습니다.

 

그 수첩을 재산처럼 가지고 다니면서 단순하게는 for문 사용법 부터 해서 그래픽 모드로 전환하는

방법까지 모두 적어 두었다가 필요할때가 되면 그 부분을 찾아서 그대로 응용했습니다.

요즘은 인터넷 세상이니 네이버의 개인 블로그에 참조할만한 예제나 문법들을 계속 적어두고 참조하세요.

 

(클래스나 함수 이름을 모두 기억해야 한다 생각하지 마세요. 프로그래밍은 수능이 아니니 절대로 컨닝을 하세요.)

 

 

둘째. 남들이 만든 프로그램이나 소스코드를 분석해라 (Bench Marking)

-------------------------------------------------------------------------------------------------

이론적인 공부만 하고도 프로그램을 뚝딱 만들 수 있다면, 엄청난 직관력을 가진 분이 아닌가 싶습니다.

대부분은 그러지 못하니 작은 프로그램들을 조금씩 분석하세요. 분석이 싫다면 남이 만든 프로그램들을

감상부터 하세요. (책을 사면 예제 위주로 만들어진 책의 소스코드나 인터넷 상에서 돌아다니는게 많습니다.)

 

그러면서 이런 프로그램이 있구나! 저런 프로그램이 있구나! 이렇게 구현했구나! 저렇게 구현했구나!

아니면 ~ 분석할려니 너무 머리가 아프게 복잡하게 만들어 졌구나! 정말 이해하기 편하게 만들어 졌구나!

하면서 많은것들을 느끼고, 남의것을 분석하는것이 쉽지는 않구나 라는것도 느낄겁니다.

 

이렇게 남의것을 보기도하고, 조금씩 자신의것을 구현하다 보면 어느 새 프로그래밍이라는게 편하게 다가 올 시기가 옵니다.

(처음 낯선곳에 갔을 때는 어색하다가 한달 두달 지나면 고향보다 더 익숙한 곳으로 변하는것 처럼 만드세요)

 

 

 

셋째. 프로그래밍 용어와 기능을 이해해라 (Technical Understanding)

-------------------------------------------------------------------------------------------------

대부분의 프로그래밍은 어떤 언어를 막론하고, 필요로하는 기술들은 다들 비슷비슷 합니다.

다만, 프로그래밍의 역사가 길어진 요즘에는 그 용어와 기술들이 엄청나게 많습니다.

그렇다고 하더라도 그런 프로그래밍 세계에서의 용어들을 마이동풍과 같이 흘려보내기만 한다면

고급 프로그래머가 되는데에는 시간이 더 많이 걸릴겁니다.

 

예를들어서 서버, 클라이언트, 네트워킹, 데이터베이스, 멀티스레드와 같은 큰 개념에서 부터

게임 그래픽 관련 용어나 리스트, 해쉬테이블, 트리와 같이 상세한 개념까지 처음듣는용어가 있다면

적어도 수박 겉핥기 정도는 해두셔야 합니다.

 

물리학자들이 어떤 이론을 설명할 때 수학식으로 설명하듯 수학에 대한 깊은 이해가 없다면

아무런 의사전달이 되지 않겠지요. 프로그래머들도 대부분의 이야기들이 기술적인 용어들이 많기 때문에

관련 용어들을 이해하지 못한다면 난감합니다.

 

(프로그래밍이라는 것이 단순한 개념 하나만으로 만들 수 있는것이 아니기 때문에 이 과정이 가장 오래 걸립니다)

 

 

넷째. 남들이 하는 이야기에 귀를 기울여라 (Communication)

-------------------------------------------------------------------------------------------------

위의 세번째에 익숙해 졌다면 이제부터는 프로그래머들의 이야기가 귀에 들리기 시작할겁니다.

책 중에는 당장 코딩에 도움이 되는 예제나 메뉴얼 형식의 책도 있지만, 특정분야나 개발툴에 대한 전반적인

이야기를 들려주는 책들이 있지요.

 

그런것 처럼 커뮤니티 사이트에서 많은 사람들이 하는 이야기와 문제점에 대해서

당장 필요하지는 않더라도 관심을 가질 필요가 있습니다.

 

제 아무리 뛰어난 프로그래머라도 혼자서 모든 상황을 겪어보기는 힘들것이고,

그런 문제에 봉착했을 때 ~ 아 옛날에 그런 이야기를 들었었는데, 문제가 거기에 있는걸까? 하고

문제해결의 실마리를 찾을수도 있습니다.

 

프로그래밍은 혼자 산속에 들어가 10년을 수양을 한다해서 고수가 될 수 있는것이 아니고,

많은 사람들과 소통하고 함께 이루어 가야한다는것을 알아야 합니다.

 

 

-------------------------------------------------------------------------------------------------

 

너무 조바심 내지말고, 포기하지 마세요.

 

 

Trackback 0 And Comment 0

추상 클래스 (C++)

|

 c# 자바 등을 하다보니까 c++ 이랑 헷갈리는개념.. abstract 란 키워드가 없음


추상 클래스 (C++)

Visual Studio 2013
1명 중 1명이 도움이 되는 것으로 평가 이 항목 평가

추상 클래스는 보다 구체적인 클래스가 파생될 수 있는 일반 개념의 식으로 작동합니다. 추상 클래스 형식의 개체를 만들 수 없습니다. 그러나 추상 클래스 형식에 대해 포인터와 참조를 사용할 수 있습니다.

최소한 하나의 순수 가상 함수가 포함된 클래스는 추상 클래스로 간주됩니다. 추상 클래스에서 파생된 클래스는 순수 가상 함수를 구현해야 합니다. 그렇지 않은 경우 이 클래스도 역시 추상 클래스가 됩니다.

가상 함수는 pure-specifier 구문을 사용하여 "pure"로 선언됩니다(클래스 프로토콜 구현에서 설명). 가상 함수에 소개된 예를 살펴보십시오. Account 클래스의 목적은 유용하게 사용되는 일반적 기능을 가진 Account 형식의 개체를 제공 하는 것입니다. 따라서 Account는 좋은 추상 클래스 후보입니다.

// deriv_AbstractClasses.cpp
// compile with: /LD
class Account {
public:
   Account( double d );   // Constructor.
   virtual double GetBalance();   // Obtain balance.
   virtual void PrintBalance() = 0;   // Pure virtual function.
private:
    double _balance;
};

이 선언과 이전 선언은 순수 지정자 = 0 선언없이 PrintBalance가 선언된 점이 다릅니다.


'잡다한것들전부 > C, C++, C#' 카테고리의 다른 글

c++에서 bool 형 값 true false 실수할 수 있는 부분  (0) 2014.01.13
동기화 비동기화 동기식 비동기식 이란?  (0) 2014.01.13
추상 클래스 (C++)  (0) 2014.01.10
Duff's Device  (0) 2014.01.10
c++ 11 이란??  (0) 2014.01.09
strncpy 로 메모리 복사  (0) 2014.01.07
Trackback 0 And Comment 0