'목록들'에 해당되는 글 118건
- 2012.04.03
- 2012.03.25
- 2012.03.25
- 2012.03.24
- 2012.03.24
- 2012.03.24
- 2012.03.24
- 2012.03.24
Unity를 이용하여 앵그리버드 만들기 1탄.
먼저 2D 게임을 만들기 위해서는 적절한 카메라 세팅이 필요.
Camera의 속성중 Projection의 속성을 Orthographic으로 설정해준다.
이렇게 설정해주면 카메라와의 거리와 상관 없이, 한 평면의 점은 모두 위치가 같아보인다. (원근법을 제거해버리는것)
여튼...
앵그리버트의 특징은 앵그리버드는 물리게임이라는것.
다행이도 Unity에서는 RigidBody라는 물리 Component를 제공한다.
단 주의해야할 것은 다음과 같다.
1. 우리의 오브젝트는 z값을 0으로 설정하고, z값이 변하지 않는다.
-> 이것은Rigidbody의 속성중 Contraints의 Freeze Position Z를 체크해주면 된다.
2. 우리의 오브젝트는 돌되, X축과 Y축의 방향으로는 돌지 않는다.
-> 마찬가지로 Rigidbody의 속성 중 Contraints의 Freeze Rotation의 x,y를 체크해준다.
이게 기본적인 물리 세팅이 된다.
커스터마이징 기능 구현하기 2. 데이터의 저장. (0) | 2012.05.03 |
---|---|
커스터마이징 기능 구현하기 1. Serialize란... (0) | 2012.05.02 |
[Unity] Network 정리 (2) | 2012.03.25 |
[Unity] 정리들 (0) | 2012.03.25 |
[Unity] 최적화 (1) | 2012.03.24 |
커스터마이징 기능 구현하기 1. Serialize란... (0) | 2012.05.02 |
---|---|
앵그리버드 만들기 1탄. (0) | 2012.04.03 |
[Unity] 정리들 (0) | 2012.03.25 |
[Unity] 최적화 (1) | 2012.03.24 |
[Unity] Ray의 사용 (0) | 2012.03.24 |
앵그리버드 만들기 1탄. (0) | 2012.04.03 |
---|---|
[Unity] Network 정리 (2) | 2012.03.25 |
[Unity] 최적화 (1) | 2012.03.24 |
[Unity] Ray의 사용 (0) | 2012.03.24 |
[Unity] 인자 전달 방법 (0) | 2012.03.24 |
public class example : MonoBehaviour {해당과 같이 바로 transform을 사용하게 되면. trasnform을 바로 뱉어내는게 아니고, 한번 찾아서 뱉어낸다고 하는군요. 따라서 이 방법보다는
void Update() {
transform.Translate(0, 0, 5);
}
}
public class example : MonoBehaviour {
private Transform myTransform;
void Awake() {
myTransform = transform;
}
void Update() {
myTransform.Translate(0, 0, 5);
}
}
[Unity] Network 정리 (2) | 2012.03.25 |
---|---|
[Unity] 정리들 (0) | 2012.03.25 |
[Unity] Ray의 사용 (0) | 2012.03.24 |
[Unity] 인자 전달 방법 (0) | 2012.03.24 |
[Unity] 시작 (0) | 2012.03.24 |
이번 글에서는 3D MAX를 이용해서 캐릭터를 모델링하는법에 대해 알아보도록 하죠.
먼저 3DMAX 를 키세요
그 뒤 위와 같은 그림 2장을 준비합니다. 하나는 앞모습이고, 하나는 옆모습이에요.
++++++ 시점은 요기 밑에 큐브를 잡고 돌리시면 되요.
3D MAX에서 Plane 2장을 생성해줍니다.
그런 다음에 그냥 그림 그리신거 끌어다가 넣으시면 되요..
만일 안보이신다!!! 그럼 돌려주세요 Rotate로. 이게 뒷면이면 투명하게 보여서... 양면 설정하는법을 까먹었네요
저희는 캐릭터가 둥글둥글하니까 그냥 구를 생성하고 시작하도록 하죠.
Geometry에서 -> Sphere 선택 -> 생성;;;;;; 쉽죠!?
정면과 옆면을 보면서 크기를 맞춰줍니다. Scale버튼을 이용하세요
그런 다음!(여기부터가 중요)
구를 선택하여 Edit Mesh라는 것을 추가해줍니다. 빨간색 화살표가 표시하는것 누르시면 있어요.
Edit Mesh는 5가지를 조종할수 있습니다. Vertex, Line, triangle, polygon, object요.. 주로 쓰는건 vertex,line, polygon이에요.
1. 여튼 Polygon을 선택해서
2. 구의 반쪽을 지워버립니다.
쉽죠잉?
그 다음 남은 반쪽을 선택하고 . 위의 화살표 2번이 가르키는 Mirror을 선택합니다.
Mirror에는 4종류가 있는데, No Clone은 그냥 뒤집는거고요, Copy는 그냥 해당 아이템을 복사, Instance는 복사하되 원래것을 건드리면 복사된것도 바뀌고요(맞나?), Reference는 복사된것과 원본이 서로에게 영향을 미칩니다.
여튼 reference로 복사해줍니다.
그 뒤, Polygon을 선택한뒤에 팔모양을 만들것입니다.
그림의 팔의 크기에 맞게, 적당히 폴리곤 몇개를 선택해서 구멍을 냅시다.(요것도 정면과 측면을 보면서 맞추세요/ )
대충 구멍을 뻥!!!!
그 다음 뚫린 구멍의 테두리를 Line을 선택한뒤 선택합니다. 컨트롤 누르시고 선택하시면 다중 선택이 됩니다.
그 다음!!!!! Shift를 누르고 Move로 쭉 드래그하시면 이렇게 되요!
놀랍죠!? ㅡ.ㅡ;;
계속 해서 적당히 팔모양을 맞추고 이제 팔의 면을 닫아야되는데,
닫는것은 wield라는 명령어를 씁니다.(화살표 2번) -> 요놈은 인접한 vertex들을 하나로 합쳐버립니다.
팔 끝부분에서 한번더 폴리곤을 생성하시고(Shift + Move)
1. 점을 Scale로 가깝게 만들어줍니다.
2. 충분히 가깝게 하고 wield를 누르시면 vertex들이 하나로 합쳐집니다.
나머지 다르는 빠르게 완성해봤어요.
여기서 반쪽을 지웁니다.
나머지 반쪽을 선택하시고 Mirror -> Copy로 생성합니다.
한쪽을 선택하시고 오른쪽 창에 Attach라는 것이 존재하는데
1. Attach를 누르시고
2. 나머지 반쪽을 선택합니다.
이제 그 두 오브젝트는 하나로 합쳐졌습니다.
Vertex를 이용해서 중앙의 점들을 하나로 이어주세요.
-끝-
참 쉽죠잉
재질의 종류 (0) | 2012.07.05 |
---|---|
Sprite (0) | 2012.04.25 |
3D MAX에서 뼈대 설정해주기 (0) | 2012.04.08 |
3D MAX 하이 폴리곤에서 노말맵 뽑아내기 (0) | 2012.04.08 |
3D MAX UVMAP 펼치는법 (0) | 2012.04.08 |
Unity에서는 ray라는것을 제공합니다. ray를 사용하면 내가 화면에서 어떤 아이템을 클릭했는가를 쉽게 알 수 있게 해줍니다.
그럼 먼저
Ray 란 무엇인가?
-> Ray를 번역하면 '광선'이죠? ray는 말 그대로 광선을 뜻합니다.
시작점 : Origin
방향 : Direction
이 두가지를 가진 오브젝트로써, 시작점으로부터 방향으로 쭉 선을 그어주는 놈입니다.
Ray의 사용
- ray는 다음과 같은 곳에 쓰일 것입니다.
1. 게임에서 내 캐릭터를, 내가 클릭한 곳으로 이동시키고 싶다
2. 게임 화면에서 어떤 오브젝트를 클릭했는지 알고 싶다.
----------------------------------제가 현재까지 사용한 정도------------------------------------------------------------------
Ray 관련 중요 메쏘드
- 그럼 Ray와 관련된 중요 메쏘드들을 살펴봅시다.
1. Camera.ScreenToRay(pixelwidth, pixelHeight) //(http://unity3d.com/support/documentation/ScriptReference/Camera.ScreenPointToRay.html)
- 이 메쏘드는 카메라를 origin으로 삼고, 인자로 받을 픽셀로부터 자동으로 방향을 결졍해주는 함수입니다.
즉, 이 메쏘드는 위에서 언급한 2가지의 경우를 처리하기 위해 필수인 요소입니다.
2. Plane.Raycast(Ray _r, out float _f) //(http://unity3d.com/support/documentation/ScriptReference/Plane.Raycast.html)
- 이 메쏘드는 특정 평면과 Ray와의 충돌을 체크하여 Ray의 Origin으로부터 충돌지점까지의 거리를 _f에 저장하여 줍니다.
응용.
- 위의 두가지를 응용하면 Ray의 사용 1번을 구현할 수 있습니다.
1
2
3
4
5
6
7
8
9
|
Plane zeroPlane = new Plane(Vector3.up, Vector3.zero); float distance; Vector3 pos; Ray ray = MainCamera.ScreenPointToRay(Input.mousePosition); if (zeroPlane.Raycast(ray, out distance)) { pos = ray.origin + ray.direction * distance; } |
위의 코드를 살펴보면, zeroPlane이라는 y축의 값이 0인 평면과, MainCamera에서 쏜 Ray를
zeroPlane.Raycast(ray,out distance))를 통해 처리하고있습니다.
실제 충돌 좌표를 구하는 작업은 8번째 줄입니다.
Vector3 pos에 ray의 원점, 그리고 ray의 방향(노말 벡터)에 거리를 곱해서 구한 것입니다.
3. Physics.Raycast //http://unity3d.com/support/documentation/ScriptReference/Physics.Raycast.html
- 이 함수는 오버로딩(?)이 되어있습니다. 함수는 기본적으로 충돌하면 참을 반환합니다.
1. (vector3 중심, vector3 방향, float 최대 거리, layermask(?)) (Ray ray, float 거리, layermask)
-> 이 함수는 최대 거리 안에 Collider와 충돌을 하면 true값을 반환해 줍니다.
2. (vector3 중심, vector3 방향, out RaycastHit _r, float 거리, layermask), (Ray ray,out RaycastHit _r, float 거리, layermask)
-> 이 함수를 사용하여 어떤 오브젝트에 가장 먼저 충돌했는지 알 수 있습니다. 그리고 이것을 이해하기 위해서는
RaycastHit이라는 놈을 알아야 합니다.
RaycastHit //http://unity3d.com/support/documentation/ScriptReference/RaycastHit.html
- ray와 충돌한 오브젝트의 정보를 담기 위한 자료입니다.
이를 통해,
충돌한 지점 point,
충돌한 지점의 노말 벡터 ,normal
거리 ,distance
충돌된 오브젝트, collider ->요놈이 필요해요
rigidbody
transform
위의 것 외에도 더 있지만, 제가 모르기에 설명 안합니다.
응용
-> 이제 1번과 3번을 응용하여 내가 어떤 오브젝트를 선택했는지 알 수 있습니다.
1
2
3
4
5
6
7
|
Ray ray = MainCamera.ScreenToRay(Input.mouseposition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Debug.Log(hit.collider.name); } |
위의 코드를 그대로 해보면 자신이 클릭한 collider의 이름이 출력되는것이 보일것입니다.
---------------------------------------------------------------------------------------------------------------------------------------
저는 카메라에만 사용하였지만, ray는 특정 방향으로 오브젝트가 충돌했을 경우를 체크하기에 유용함으로 쓰기 나름입니다.
[Unity] Network 정리 (2) | 2012.03.25 |
---|---|
[Unity] 정리들 (0) | 2012.03.25 |
[Unity] 최적화 (1) | 2012.03.24 |
[Unity] 인자 전달 방법 (0) | 2012.03.24 |
[Unity] 시작 (0) | 2012.03.24 |
이 글에서는 다양한(? 그래봤자 3가지정도)방법을 이용하여 인자를 전달하는 방법을 알아보도록 하겠습니다.
1. 그냥 Public 변수의 선언
- 가장 간단한 방법입니다.
스크립트에 public float life; 와 같은것을 해준다면, 게임 오브젝트를 클릭했을 때 Inspector 창에서 수정이 가능한 형태로 나옵니다.
2. SendMessage의 사용
- 별로 추천하지 않는 방법입니다. GameObject.Sendmessage("Method Name",인자); 를 통해 지정한 GameObject가 포함한 스크립트에 MethodName이 있다면 그 함수를 실행합니다.. 단점은...... 인자를 한개밖에 못넘겨요..........(틀렸으면 댓글좀요)
예)
Box라는 이름의 게임 오브젝트는 ScriptA라는 스크립트를 컴포넌트로 가지고 있다.
ScriptA라는 스크립트는 Method(float 인자) 라는 함수를 가지고 있다.
그러면 외부에서 Box에 존재하는 Method를 실행하고 싶다면 다음과 같은 코드를 사용합니다.
1
|
GameObject.Find("Box").SendMessage("Method", 1.0f);
|
3. ScriptName을 통해 함수 실행
-> 이게 개인적으로 제일 좋은것이라 생각함요.
1
2
3
4
|
var Script : ScriptName; Script = GetComponent(ScriptName); Script.Method(); |
이 방식을 통해서 해당 게임 오브젝트에 존재하는 스크립트의 함수를 실행 할 수 있다.
따라서 이를 응용하여 다른 게임 오브젝트의 함수를 실행한다고 치자.
상황
- 총알(Trigger)이 날아가 어떤 플레이어를 맞춘다 그리고 총알을 맞은 플레이어는 죽는다..
알아둘 것
1. 총알은 Trigger이므로 OnTriggerEnter에 처리를 한다.
2. 플레이어의 메쏘드 IsDead()는 플레이어의 상태를 죽음으로 바꿔주고, State라는 스크립트 파일의 메쏘드이다.
1
2
3
4
5
6
7
|
//script for 총알
void
OnTriggerEnter(Collider col) { GameObject player = col.gameObject // 맞은 플레이어는 col로 받아들여진다. col.gameObject 를 통해 해당 플레이어의 게임 오브젝트를 player에 저장한다. State Script = player.GetComponent<State>(); Script.IsDead(); //플레이어의 상태가 죽음으로 바뀜 } |
[Unity] Network 정리 (2) | 2012.03.25 |
---|---|
[Unity] 정리들 (0) | 2012.03.25 |
[Unity] 최적화 (1) | 2012.03.24 |
[Unity] Ray의 사용 (0) | 2012.03.24 |
[Unity] 시작 (0) | 2012.03.24 |
먼저 유니티란?
- 유니티는 게임 엔진입니다.
는 장난반, 진담 반. 여튼 CBES의 기법을 사용하여 만든 게임엔진입니다.
CBES(Component Based Entity System)
- CBES란 무엇이냐....
해석해보면, 부품(component)를 중심으로한 개체(Entity) 시스템이라고 합니다.
예를 들어보록 하죠. 레고조립을 예로 들어보죠....
당신이 레고 부품들을 이용해서 로봇을 만든다고 칩시다.
로봇의 큰 부품을 팔, 몸통, 머리, 다리, 무기 크게 분류해보죠.
그럼 당신은 로봇을 어떻게 만듭니까?
각각 부분에 맞는 부품을 넣죠?
이와 같습니다.
Unity에서는 GameObject라는 그릇에 Component들을 집어넣습니다.
이 오브젝트에는 물리효과가 적용되니까 '물리효과 부품'을 넣자
이 오브젝트는 빛이 나야되니까 '빛을 내는 부품'을 넣도록 하자.
이러한 형식으로 하나의 Game Object를 생성합니다.
Compont의 범위와 종류
- 유니티에서 어느 범위까지 Component로 취급하는지, 그리고 무슨 부품들이 존재하는지 알아보도록 하겠습니다.
Transform - 게임 오브젝트의 위치정보를 담는것입니다.
위치를 Vector3에 담아놓고, 방향등의 추가적인 정보도 존재합니다.
이 정보는 무조건들어 있는 정보입니다.
http://unity3d.com/support/documentation/ScriptReference/Transform.html
Collider - 이 부품은 충돌을 체크하기 위한 부품입니다.
말씀드리지만 "충돌"만입니다. 충돌할 경우의 물리적인 효과는 아무것도 없습니다.
collider와 같이 충돌을 체크하는 것들은 많이 존재함으로, 다음번 글에서 다루도록 하겠습니다.
http://unity3d.com/support/documentation/ScriptReference/Collider.html
Animation - 애니메이션을 플레이해주는 기능을 지닌 부품입니다.
아..... 다 말해줄 수는 없을 것 같아요... 너무 많거든요? 그래서 컴포넌트의 종류는 이만하고 가장 중요한걸 이야기 하도록 하죠.
그것은 바로 Script의 존재입니다.
Script(스크립트)란 자기가 직접 정의한 부품을 말하는 것입니다.
예를들어, 음..... 나는 이 검에 불효과를 넣겠어!!!!. 라고 하면, 불 효과를 스크립트로 작성하여 게임 오브젝트에 붙여주시면 됩니다.
유니티는 스크립트를 javascript/C#/boo 이 세가지로 제작할 수 있게 하는데.. 저는 C#으로 설명할 것입니다.
Unity는 사용자가 직접 정의한 부품들도 Component로 취급하게 해주어, 아주 대단한 일을 할 수 있게 만들어 줍니다.
Component 관련 함수들(C# 으로 설명합니다)
- 컴포넌트 관련 함수들은 다음과 같은 것들이 존재합니다.
1.GetComponent // http://unity3d.com/support/documentation/ScriptReference/Component.html
- 이는 게임 오브젝트에 속해있는 부품 하나를 가져옵니다.
ex) 현재 오브젝트에 있는 Collider라는 정보를 가져오는 스크립트를 짜봅시다.
1
|
Collider col = GetComponent<Collider>(); |
2. GetComponent(s)InChildren
- 괄호친 것은 있어도되고 없어도 됩니다.
하면 복수로 불러와요
예를 봐봅시다
Collider[] col = GetComponentsInChildren<Collider>();
위의 코드를 치면 Collider라는 컴포넌트들을 리스트로 만들어서 반환을 해줍니다.
3. 컴포넌트의 추가와 삭제
- 레고에서 부품을 추가하고 제거 할 수 있듯이, 유니티에서도 부품을 동적으로 추가/제거 할 수 있습니다.
부품을 추가/제거하기 위한 코드는 다음과 같습니다.
1
2
3
4
5
|
//추가하는 방법 gameObject.AddComponent( "Component Name" ); //제거하는 방법 Destroy(gameObject.GetComponent<Component Name>()); |
Destroy같은 경우는 모든 파괴에 사용이 됩니다.
Script를 컴포넌트로써 활용하기
- 위에서 언급했듯이 스크립트 또한 하나의 부품으로 취급됩니다.
이 말은 즊!!!!! 한 스크립트에서 다른스크립트의 정보를 가져와 함수를 실행 할 수 있다는 이야기입니다.
뭐 간단히 가정을 하도록하죠.
ScriptA - 나는 플레이어를 죽게 만들 수 있지. 그러나 PlayerHp라는 정보가 필요해
ScriptB - 나는 플레이어의 PlayerHP를 관리하는 스크립트다. PlayerHp는 GetHp()라는 함수로 얻을 수 있어.
지금 상황에서는 ScriptA가 ScriptB의 함수를 실행해야 하는 경우죠. 이런 경우는 다음의 코드로 실행 할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
//ScriptB의 구현 public class ScriptB : MonoBehavior { private float PlayerHP; void Update() { //hp처리 } public GetHp() { return PlayerHp; } } //ScriptA 의 구현 public class ScriptA : MonoBehavior { private ScriptB script; //요렇게 자료형을 스크립트 이름으로 해주어야 합니다. void Start() { script = GetComponent<ScriptB>(); //두 스크립트는 같은 오브젝트의 부품이니까, GetComponent<스크립트 이름>으로 가져옵니다. } void Update() { if (script.GetHp() < 0) // 요렇게 합니다 { //나 죽었어요 처리 } } } |
이는 두개의 스크립트가 같은 오브젝트에 있을 경우에만 사용이 가능합니다.
다른 방법으로 스크립트의 함수를 실행 할 수 있지만 다음 글에서 설명하도록 하겠습니다.
http://unity3d.com/support/documentation/ScriptReference/Component.html
[Unity] Network 정리 (2) | 2012.03.25 |
---|---|
[Unity] 정리들 (0) | 2012.03.25 |
[Unity] 최적화 (1) | 2012.03.24 |
[Unity] Ray의 사용 (0) | 2012.03.24 |
[Unity] 인자 전달 방법 (0) | 2012.03.24 |