GameForFun

블로그 이미지
by PforPepsi

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

'목록들'에 해당되는 글 118건

  1. 2012.04.03
    앵그리버드 만들기 1탄.
  2. 2012.03.25
    [Unity] Network 정리 2
  3. 2012.03.25
    [Unity] 정리들
  4. 2012.03.24
    [Unity] 최적화 1
  5. 2012.03.24
    3D MAX를 이용한 캐릭터 모델링
  6. 2012.03.24
    [Unity] Ray의 사용
  7. 2012.03.24
    [Unity] 인자 전달 방법
  8. 2012.03.24
    [Unity] 시작

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를 체크해준다.


이게 기본적인 물리 세팅이 된다.

'[Unity3D]' 카테고리의 다른 글

커스터마이징 기능 구현하기 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
AND
http://unity3d.com/support/documentation/Components/net-HighLevelOverview.html

권한 2가지 방식

1. Authoriative
-
 방법은 서버에서 클라이언트에 정보를 지속적으로 넘겨주어 클라이언트의 변화를 허락하는 방식이다. 사용자가 입력하면 서버에거 입력을 받고, 그에 맞는 처리를 한다음에 다시 사용자에게 돌려주게된다.

모든 처리를 서버에서하게 됨으로 공격을 받을일이 거의 없지만, 서버에서 처리하는 내용이 많아서 비효율적일수도 있다.
따라서 부분적으로 클라이언트에 권한을 넘겨줘서 클라이언트가 처리하도록 할 수 있는 방법도 존재한다.

2. Non-Authoriative 
- 클라이언트에서 대부분의 로직을 처리하고, 서버에게 처리된 로직을 넘겨줘서 클라이언트간의 데이터를 싱크하는 방식이다.


통신의 방법

1. RPC (Remote Procedure Calls)
- 이 방법은
서버, 클라이언트에서 반대방향(클라이언트, 서버)에 존재하는 함수를 실행하는 방법이다. 

2. State Synchronization
- 이 방법은 자동적으로 데이터들을 맞춰주는 것이다. 플레이어들의 위치, 몬스터의 위치 등을 이것으로 설정해준다면, 자동적으로 맞춰줄 것이다.

서버와 클라이언트 연결하기
- IP주소를 알아야하며, 방화벽 설정을 해줘야한다.  
 

네트워크 함수들

1.Network.Instantiate()
- 연결되어 있는 모든 클라이언트에게 Instantiate명령을 내려주는 작업이다.

2.Network.LoadLevel()
  
 

'[Unity3D]' 카테고리의 다른 글

커스터마이징 기능 구현하기 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
AND
1. FBX를 통해 케릭터 모델을 로딩할때, 한 FBX파일에 애니메이션을 몰아 넣어놓고Split Animation을 통해 애니메이션들을 수동으로 쪼갤 수 있다.

2. FBX를 통해 캐릭터 모델을 로딩할때, Generate  Collider를 On으로 설정해주면 Mesh 그대로 Collision을 체크해준다.  단!. 지형에만 쓸것을 추천하고 움직일것이라면 OFf로 지정, 일반 Collider들을 사용하는것을 추천
 

'[Unity3D]' 카테고리의 다른 글

앵그리버드 만들기 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
AND
http://unity3d.com/support/documentation/ScriptReference/index.Performance_Optimization.html 
참고.

1.  
private 변수의 사용
 꽤나 쇼크인 내용.

유니티에서는 게임오브젝트의 컴포넌트를 항상 getcomponent로 찾는 모양입니다.
public class example : MonoBehaviour {
void Update() {
transform.Translate(0, 0, 5);
}
}
해당과 같이 바로 transform을 사용하게 되면. trasnform을 바로 뱉어내는게 아니고, 한번 찾아서 뱉어낸다고 하는군요. 따라서 이 방법보다는
public class example : MonoBehaviour {
private Transform myTransform;
void Awake() {
myTransform = transform;
}
void Update() {
myTransform.Translate(0, 0, 5);
}
}
요것과 같이 내부에 private 변수를 따로 두어 변경해주는것이 더욱 좋다고 합니다.

 

'[Unity3D]' 카테고리의 다른 글

[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
AND

이번 글에서는 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
AND

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는 특정 방향으로 오브젝트가 충돌했을 경우를 체크하기에 유용함으로 쓰기 나름입니다.

 


'[Unity3D]' 카테고리의 다른 글

[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
AND

이 글에서는 다양한(? 그래봤자 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(); //플레이어의 상태가 죽음으로 바뀜
}
이러한 방법으로 게임오브젝트에 다가가 특정스크립트의 메쏘드를 실행 할 수 있다.


'[Unity3D]' 카테고리의 다른 글

[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
AND

먼저 유니티란?

- 유니티는 게임 엔진입니다.  


는 장난반, 진담 반.    여튼 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



'[Unity3D]' 카테고리의 다른 글

[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
AND

ARTICLE CATEGORY

목록들 (118)
[Unity3D] (39)
그래픽관련 (13)
잉여잉여 (25)
프로그래밍 (27)
노래♬ (3)
Game_Design(기획) (3)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2024/05   »
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

ARCHIVE