라인 렌더러 사용하기(게임 내 레이저 효과)

|

FPS 게임에서나 당구 게임에서 레이저 효과를 구현하려고 한다.

유니티 내에 제공하는 LineRenderer 라는 컴포넌트에서 이것을 지원해준다.

먼저 LineRenderer 컴포넌트를 빈 게임 오브젝트에 설치한다.



컴포넌트에서 Materials 를 설정해 줄수 있고

Positions 로 처음 위치 마지막 위치를 설정해 줄수도 있다.

그리고 선 길이도 설정해줄수 있다.


아래 스크립트를 붙이고 메트리얼도 유니티에서 제공되는 기본 파티클 메트리얼을 하나 입혀보자.









아래 그림처럼 처음위치(0,0,0) 에서 위로 쭉 레이저 같은 선이 생기는 것을 볼수 있다.





Trackback 0 And Comment 0

드래곤 플라이트 움직임(마우스 드래그) Unity3D

|

마우스 드래그를 사용해서 비행기를 움직여보자.

먼저 여러가지 방벙이 있다.

레이 캐스트를 사용한다던가. 유니티 내부 API인 OnMouseDown 함수를 사용한다던가.


필자는 후자를 선택하겠다.




GameManager 에 사이즈 100, 100, 1인 콜라이더를 부착시킨후 GameManager 스크립트를 할당하였다.

Mathf.Clamp를 이용해 드래곤의 이동거리를 제한하고 가로로만 움직이기 때문에 y와 z값은 0으로 초기화 시켜주었다.

마우스 좌표를 월드 좌표로도 변경시켜주었다.

일단 성능상에 문제가 없을지 걱정이된다,

Drag 함수같은경우에는 매 프레임마다 호출되는 함수라.. 추후 성능상 문제가 있으면 연구해보자.




Trackback 0 And Comment 1
  1. 하늘비호 2015.03.28 00:11 address edit & del reply

    안녕하세요. 이런 움직임을 구현중에 있는데요. 찾아보던중 딱 여기에 원하던 정보가있네요.
    한가지 궁금한점이 있는데요.
    제가 초보라...
    z축까지 움직이게 하고싶은데 어떻게 하면 될까요?

    아 그리고 퍼가겠습니다~

유니티 재귀함수의 예(헥사, 캔디팡) -Recursive Methods

|

관련 스크립트



헥사게임같은경우

3개의 각 다른 블록이 떨어지므로 각각의 블록에 해당되는 블록마다 재귀함수를 적용해서 호출해줘야됨


1. 3개의 블록 떨어트리고 고정

2. 아래에서부터 차례대로  고정된 블록 주위로 같은 블록이 있는지 검사

3. 같은 블록은 List 에 저장

4. 같은 블록이 3개 이상이면 없애주기



- List 사용시 각각 다른 List 사용

- 중복 제거


CheckMatchHexa 에서 아래에서부터 차례대로 체크를해줌

CheckBlockMatch 함수에서 매치되는 블록 삭제 처리

CheckBlock은 재귀호출로 같은 타입이 있으면 계속해서 호출되고  List 에 저장됨,


Block 스크립트의

SelfDestroy 코루틴 함수에서는 타입을 empty로 변경한후

껏다켰다를 반복 (enabled로()후 마지막으로 _blocks의 이차원 배열에 해당되는값 null로 변경, 

그리고 Block 스크립트를 할당하는 게임오브젝트 삭제













동영상 - 재귀함수에 대한 설명

http://youtu.be/p4yJ_JgAPgQ





출처 : http://www.devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=21651





여러가지 방법이 있는데요 일단 Tag를 이용하는방법을 설명해 보겠습니다 
게임 블럭의 종류대로 TAG를 추가 합니다  태그명은 뭐 알아서 ^^;  
저는 편의상 Block0~Block3로 할께요 

Grid[x,z] = GameObject.Instantiate(Blocks[index1], new Vector3(x,0,z), Quaternion.identity)as GameObject; 
Grid[x,z].tag = "Block" + index1; //이렇게 코드에 추가하신후에 

터치된 블록주위를 검사해서 자신의 TAG와 같은 애들이 3개 이상이면 삭제 하시면 되겠습니다 

블록을 검사하는 방법에 대해 물으신 거라면 
잠깐 생각해보니 리커시브 함수를 써야 될것 같습니다 

특정 블럭 즉, 자신을 중심으로 상하좌우 블럭을 조사하는 함수를 만드시고 함수내 상하좌우 블럭 조사할때 다시 해당 함수를 리커시브하게 불러서 또다시 상하좌우를 조사하시면 되겠네요 
이때 이미 조사한 블럭은 중복될 수 있기때문에 이미 조사한 블럭은 어딘가에 기록으로 남겨놓아야 중복 조사를 방지 할수 있을겁니다 


재귀 함수를 한번도 사용해 보지 않으셨으면 로직을 이해하는데 약간 어려움을 느끼실 것 같은데요 
곰곰히 잘 생각해보면 그리 어렵지도 않습니다 

일단 작성하신 CheckBlock 함수가 특정 좌표(x,z)를 받고 상하좌우를 검사하는 함수잖아요 
일단 return에서 부르는 CheckBlock(x,z)는 주석처리 하시고 (왜냐하면 현재 위치를 또 검사하면 무한으로 계속 부르게 되니까요) 
지금 gameObject자체를 비교하고 계신데 tag비교로 바꿔주시고 

if(x > 0 && Grid[x,z].gameObject == Grid[x-1,z].gameObject){ 

// 전역변수 List에 해당 좌표쌍을 저장하는 코드 삽입 

CheckBlock(x-1, z); 


위 처럼 다른 사방에도 해주시면 됩니다 
로직을 설명드리자면 특정 블럭 위치(x,z)의 상하좌우를 검사해서 
동일한 Tag가 있는 블럭위치(a,b)를  저장할 수 있는 전역변수 C라는 List 변수에 해당 위치를 저장해 주고 

또 다시 (x-1, z)블럭위치로 위 함수를 호출 하는것이죠 

결과적으로 전역 C변수에는 블럭 주변에 동일한 Tag가 있는 모든 블럭위치를 저장하게 될 겁니다. 
그리고 먼저 말씀 드렸다 시피 해당 블럭위치가 이미 저장되어 있는지 검사해서 함수를 호출해야 무한루프에 
빠지지 않을 겁니다. 






Trackback 0 And Comment 0