VFX-KARA
KARA FX HOUSE
VFX-KARA
전체 방문자
오늘
어제
  • FX HOUSE (106)
    • My Effects Work (20)
    • My 2D/3D Work (18)
    • My VFX RND (12)
    • Programming (1)
      • Unity c# (1)
      • Python (0)
      • JAVA (0)
    • VFX Tutorial (16)
      • PhoenixFD (5)
      • FumeFX (1)
      • Etc. Plug-in (2)
      • Etc. Max-Script (2)
      • Particle Illusion (6)
    • Game Engine (23)
      • Unity (21)
      • Gamebryo (2)
    • 컴터지식IN (7)
    • 나의 일상 (4)
    • 연습장 (5)
    • Ect (0)
      • 휴지통 (0)

블로그 메뉴

  • Home
  • Tag
  • MediaLog
  • LocationLog
  • Guestbook
  • Admin
  • Write

공지사항

  • VFX카라 [블로그 공지]

인기 글

태그

  • PhoenixFD
  • 열혈고교
  • 마르코
  • 잉키
  • Singleton pattern
  • 싱글톤 패턴
  • FUME FX
  • Unity
  • kaboom
  • 열혈돗지볼
  • 유니티
  • 3D
  • C#
  • 이펙트
  • 인피니티

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
VFX-KARA

KARA FX HOUSE

Game Engine/Unity

No.8 Unity 3D Platform Tutorial "Adversaries"

2010. 8. 9. 18:47
 





적

어떠한 게임도 플레이어와 맞서는 적이 없이는 완성될 수 없습니다. 본 챕터에서는 럽츠가 싸우게 될 적들을 추가합니다.


적들, 그리고 전투

이 두 가지 요소는 모든 게임의 핵심이기 때문에 우리는 럽츠를 계속 긴장하게 해야 할 무언가가 필요합니다. 게임 디자이너의 일은 플레이어가 가는 길에 극복할 만한 장애물을 던지는 것입니다.

럽츠는 두 가지 형태의 적을 만납니다: 경비 로봇과 레이저 트랩입니다.


레이저 트랩

레이저 트랩은 레이저 통로에 위치해 있으며 플레이어가 빔을 건드리는 즉시 피해를 입힐 것입니다. 아래의 이미지에서는 두개의 레이저 트랩을 보여주고 있습니다. 우리는 이들을 감옥에서 멀리 떨어진 레벨 양 끝 쪽에 위치한 짧은 통로 구조물속에 설치할 것입니다.






럽츠가 두개의 레이저 트랩과 맞닥뜨리고 있습니다.

레이저는 오르내립니다. 만약 플레이어가 이중 하나를 지나치려 한다면 약간의 체력을 잃을 것입니다.


레이저 트랩 구현하기

각각의 레이저 트랩은 단순히 동일한 수직면으로 오르내리는 빔입니다. 만약 럽츠(또는 적)가 빔에 닿는다면, 데미지를 받을 것입니다.

레이저 빔 자체는 자기 고유의 게임객체에 포함된 Line Renderer 구성요소를 이용하여 만들어졌습니다. 빔의 움직임과 이를 제어하는 로직은 모두 LaserTrap 스크립트에 포함되어있습니다. 이제 우리의 첫 레이저 트랩을 만들어 봅시다:

ㅁ 빈 게임 객체를 생성합니다.

ㅁ "Laser"라 이름 짓습니다.

ㅁ Line Renderer 구성요소를 추가합니다. (Component->Miscellaneous->Line Renderer)


☆ 참고

아직 레이저를 위치시키지 마십시오! 먼저 "Use World Space" 체크박스를 해제해야합니다;
그 이유는 나중에 설명하도록 하겠습니다.

ㅁ LaserTrap 스크립트를 추가합니다.

ㅁ Line Renderer 구성요소의 설정을 아래와 같이 수정합니다. (레이저 자료는 Particles-> Sources->Materials에서 찾을 수 있습니다)


Line Renderer 설정.

ㅁ 결과물인 객체를 레이저 터널에 배치합니다. (레이저 터널은 감옥에서 멀리 떨어진 레벨 양 끝 쪽에 위치한 지붕 씌운 복도 건물입니다.)

ㅁ Point Light 게임 객체를 Laser 객체의 하위 객체로 추가합니다.

ㅁ Point Light를 아래와 같이 설정합니디:


레이저 트랩 포인트라이트(Point Light: 광점원) 설정

포인트라이트는 레이저의 광원으로 사용되며 레이저와 함께 오르내릴 것입니다. 이렇게 함으로서 Line Renderer에 의해 그려진 레이저 빔이 빛을 내는 듯한 효과를 줄 수 있습니다.


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

Line Renderer 구성요소

이름이 암시하듯이, Line Renderer는 무대내의 3D 공간에 선(Line)을 그립니다. Line Renderer는 선이 그려지는 점의 연속들을 정의하는 배열을 포함하고 있습니다. 선 자체는 Trail Renderer 구성요소와 같은 렌더링 테크닉을 이용해 그려지며, 이는 레이저 또는 번개 등을 그리는데 이상적입니다.
 
-------------------------------------------------

ㅁ 다음은 LaserTrap 스크립트의 속성을 아래와 같이 설정할 차례입니다:


LaserTrap 스크립트의 속성.


★ 팁

LaserHit 에셋은 Project Pane의 Props 폴더에서 찾을 수 있습니다.

ㅁ 마지막으로 LaserTrap을 복제하여(Mac에서 CMD+D 또는 Ctrl+D), (또는 Prefab을 생성하여) 적절하다고 생각하는 곳에 배치합니다. 본 튜토리얼에서는 각 터널에 두개씩 총 네 개를 배치하는 것을 추천합니다.

LaserTrap 스크립트의 속성을 만족할만한 결과가 나올 때까지 부담 없이 변경하고 실험하십시오.


레이저 트랩 스크립트

레이저 트랩의 핵심은 LaserTrap 스크립트입니다. 이 스크립트에 대해 자세히 알아봅시다...


개요

레이저 트랩은 Line Renderer 구성요소로서 스크립트에 의해 위아래로 움직입니다. 이 스크립트는 또한 충돌을 낮게 체크하고 일어나야할 필요한 시각적 효과를 작동시킵니다.

먼저, 레이저 트랩의 기본 속성들을 정의해 보겠습니다.

• height는 움직임의 진폭을 정의하며, 시작점으로 부터 얼마나 높고 낮게 레이저 빔이 움직일 것인지를 지시합니다.

• speed는 빔이 얼마나 빨리 움직이는가를 정의합니다.

• timingOffset은 각 레이저 트랩 객체가 반복된 움직임을 다른 시점에 시작하도록 합니다.

• laserWidth는 레이저의 한쪽 끝에서 부터 반대쪽 끝까지의 넓이를 정의합니다.

• damage는 플레이어가 레이저를 지나갈 때 얼마나 많은 데미지를 받을 것인가를 정의합니다.

• hitEffect는 임의의 게임객체로 링크하기 위해 사용될 수 있으며 무언가가 레이저 트랩을 건드렸을 때 인스턴스화 될 것입니다. 이는 레이저 트랩 객체의 어려운 코드보다 좀 더 유연하여 다른 프로젝트에서 이 에셋을 재사용하기 쉽게 합니다.

이 스크립트는 두개의 함수를 정의하므로 하나하나씩 알아보도록 합시다:

Start() 함수는 Line Renderer 구성요소를 초기화하며, 초기 지점을 저장하며 laserWidth로 정의된 위치와 매치시킬 Line Renderer의 두번째 꼭짓점을 설정합니다. 이렇게 함으로서 복도의 넓이와 빔의 넓이가 서로 맞도록 쉽게 조정할 수 있습니다.


☆ 참고

우리는 수동으로 Line Renderer의 배열에서 각 선 양끝의 좌표를 설정할 수도 있지만, 이 스크립트를 이용해서 다루는 것이 게임 내에서 레이저 빔을 애니메이션화 하는 데에 좀 더 많은 유연성을 제공합니다.

이제 Update() 함수를 다뤄봅시다. 이 부분이 바로 아주 흥미로운 일들이 생기는 부분입니다.

먼저 우리는 레이저 빔의 움직임을 계산해야합니다. 우리는 Mathf.sin() 함수를 이용할 것입니다. 우리는 현재시간을 Time.time을 이용해 알아낸 다음(게임이 시작 후의 시간을 초로 알려줍니다) 우리가 원하는 애니메이션의 속도와 곱한 후 timingOffset값과 더합니다. 이 값은 사인 커브 내의 우리의 위치를 나타냅니다. 마지막으로 우리는 이 값을 height의 값으로 조정하여 나온 결과 값을 지면으로 부터의 Offset값으로 사용합니다.

다음 단계는 충돌을 체크하는 것입니다. 스크립트는 빔의 경로에 광선을 쏘아(casting a ray) 컬라이더 구성요소가 첨부된 게임객체가 이것과 부딪치는지를 체크합니다.

(반응을 위한 시간을 허용하기 위해 시간 기준 테스트가 존재합니다. 만약 시간 기준 테스트를 하지 않으면, 플레이어는 레이캐스트(Ray-cast)와 충돌하는 매 프레임 마다 체력 포인트를 잃을 것입니다.)

만약 레이캐스트가 무언가와 충돌하면, 우리는 그것이 플레이어인지 또는 적인지, 그리고 만약 둘 중 하나라도 해당된다면, "Apply Damage" 메시지를 그 부딪친 대상에 보냅니다. 그 동시에 우리는 또한 hitEffect 게임 객체를 인스턴스화 하여 그것에 포함된 논리를 행할 수 있도록 합니다. 아래의 사진에 보이는 효과는 LaserHit 게임 객체로서, 에너지 폭발 효과를 만들어냅니다:


레이저에 맞는 것은 건강에 해롭습니다.

이제 튜토리얼을 플레이하면, 럽츠가 레이저 빔에 닿을 때 체력 포인트를 잃는 것을 볼 수 있을 것입니다.


경비 로봇

움직이는 적들은 경비 로봇들로, 레벨에 걸쳐 전략적으로 배치되어있습니다. 럽츠가 범위 내에 진입하면 경비 로봇들은 럽츠에게 달려들어 그를 해하려고 할것입니다.


경비 로봇

본 게임에서 럽츠의 적은 경비 로봇들입니다. 이 특정 모델은 이제 보전가치가 있는 고전적인 디자인으로 여겨집니다. 수집가들과 열성팬들은 지난날의 고전적 보물들인 포드 에셀(Ford Edsel), 애플 리사(Apple Lisa) 그리고 싱클레어 C5(Sinclair C5)와 호의적이지 않은 비판과 함께 이를 비교하기도 합니다.

이 특정 모델은 몸체 부분에 잘 겨냥한 수차례의 펀치에 민감하도록 한 교묘한 디자인 방식 덕분에 잘 알려져 있습니다. 그리하여 로봇들이 펀치에 맞아 무력화되면, 로봇들은 그들이 가지고 있는 아이템을 뱉어내며 그 후 로봇들은 BIOS가 재부팅될 때까지 행복하게(?) 지면에 널브러져 있을 것입니다. 다만 BIOS의 재부팅은 근접센서가 작동할 때에만 가능하지만 인근에는 이 센서가 없습니다. 이제 이 경비 로봇들은 정원의 장식물로서 쓰입니다.

위의 설명으로 부터 우리가 알 수 있는 것은:

• 로봇들은 상당히 기초적인 AI를 가지고 있습니다.

• 로봇들은 때려 눕혀지면 수집이 가능한 아이템을 뱉어냅니다.

• 로봇들은 플레이어가 그들을 볼 수 없을 때 리스폰 됩니다.


수색과 섬멸(Seek & Destroy)

대부분의 게임 AI는 주로 지능보다는 모델링 행동에 중점이 맞춰져있습니다. 우리의 로봇들은 의도적으로 약간의 현실적인 지능을 보이지만, 단지 플레이어의 존재에 예측 가능한 범위 내에서 반응합니다. 이는 꼭 나쁘다고 할 수는 없습니다: 많은 게임 플레이어들은 이와 같은 행동을 좋아합니다. 이러한 행동은 플레이어들에게 파악할 수 있는 패턴을 주게 함으로서 로봇을 무찌르는 방법을 쉽게 터득할 수 있도록 해주기 때문입니다.

경비 로봇들은 그리하여 아주 간단한 행동 패턴을 가지며 이는 EnemyPolicyGuy라는 메인 AI 스크립트에서 반영되었습니다.

대기(Idle) -- 이 모드에서는 경비 로봇들은 그냥 로봇 서있는 채로 '로봇사고'를 하며 조용히 시간을 보냅니다. 그리고 범위 내에 침입자가 들어오기를 기다립니다.

위협(Threaten) -- 만약 침입자가 경비 범위 내에 들어오면, 경비 로봇은 대기모드에서 빠져나와 본 기체의 목적을 알리는 동시에 들고 있는 방망이를 맹렬히 회전시킵니다. 이와 같은 행동은 본 경비 로봇의 판매 전단지에 "본 로봇이 적을 위협하는 방법"이라 광고하고 있습니다.

수색과 섬멸(Seek & Destroy) - 수색과 섬멸 모드가 활성화 되면, 경비 로봇들은 침입자에게 달려들며 공격을 시도할 것입니다.


☆ 참고

모델과 스크립트에 포함된 "turnjump"라고 불리는 애니메이션 시퀀스는 각 활성화된 모드에 사용됩니다.

피격(Struck) -- 만약 플레이어가 경비 로봇을 공격하면, 애니메이션(모델과 스크립트에 포함된 "gothit"이 재생됩니다.)

만약 플레이어가 로봇의 제한된 검색 범위에서 벗어나면, 로봇은 다시 "대기"모드로 전환할 것입니다.

위의 상태들은 EnemyPoliceGuy 스크립트에서 처리하며, 또한 애니메이션 시퀀스들 사이의 전환을 책임지고 있습니다. (플레이어와는 달리 적에 사용된 애니메이션 시퀀스는 수가 충분치 않아 따로 스크립트를 나눌 정당성을 찾지 못했습니다.)


경비 로봇 추가하기

우리 레벨에는 소수의 로봇들이 필요하므로...

ㅁ Project Pane을 열고 Enemies 폴더에 있는 Copper Prefab을 찾습니다.

ㅁ 레벨내의 적절한 지점을 찾아 무대 위에 Prefab을 드래그 해놓으면서, 지면위에 확실히 설수 있도록 배치합니다. (이 Prefab은 Character Controller 구성요소를 포함하고 있습니다. 캡슐 컬라이더의 아래 끝부분이 살짝 지면을 닿게 하거나 약간위에 떠있도록 하십시오.)

펜스가 쳐져있는 지역 또는 주위가 대부분 둘러싸인 곳이 로봇이 배경에서 떨어질 확률을 낮출 수 있습니다.

이제 게임을 플레이 하면, 주위에 대기 애니메이션을 실행중인 서있는 로봇들이 보일 것입니다. 이제 우리는 약간의 스크립트를 추가하여 이 로봇들이 좀 더 재미있는 일을 하도록 할 것입니다.

로봇에 추가되어야할 두가지 스크립트가 있으며, 우리는 이들을 기존 Prefab에 직접 추가할 것입니다.

ㅁ Copper Prefab을 선택하여 Inspector 창에 불러옵니다.

ㅁ EnemyDamage 와 EnemyPoliceGuy 스크립트를 Inspector 창의 Character Controller 구성요소에 드래그 합니다.

ㅁ 만약 지금까지 ThridPersonCharacterAttack 스크립트를 Player 객체에 드래그 해 놓지 않았다면 지금 하십시오. 이 스크립트는 플레이어의 펀치 하는 움직임을 다룹니다. (럽츠는 이 스크립트 없이 로봇들에게 펀치를 날리지 않을 것입니다!)

이제 게임을 실행하면, 플레이어가 로봇들에게 매우 가까이 다가가면 로봇들이 반응 할 것입니다.


죽음의 파란 불꽃

만약 플레이어가 로봇을 두들겨 패서 눕히는데 성공했다면, 죽음 시퀀스가 개시됩니다. 우리는 로봇이 많은 불꽃을 터뜨리며 넘어지면서 범위 밖으로 벗어나서 리셋이 될 때까지 그 자리에 널브러져있기를 바랍니다.

추가적으로, 로봇이 죽을 때, 우리는 로봇이 갖고 있는 아이템을 뱉어내길 원합니다.

더 많은 스크립트와 애니메이션 데이터, 그리고 다른 요소들을 현재 Prefab에를 추가하는 대신, 우리는 오직 우리 적의 최후의 몸부림을 위한 새 Prefab을 생성할 것입니다.


각개 격파! (Divide & Conquer)

우리의 로봇이 죽게 되면, 우리는 로봇이 플레이어에게 반응하는 것을 멈추게 하고 스크립트를 중단시켜야합니다. 이는 보기보다 간단하지 않습니다: 스크립트는 서로 독립적으로 실행되는 경향이 있기 때문에, 우리는 메시지를 보내야 할 필요가 있으며 매 사이클마다 확인되어야 하는 각 스크립트의 전용 스테이트 변수를 관리해야합니다.

그렇기 때문에 우리의 로봇 Prefab을 그냥 다른 Prefab -- 적절한 특수효과와 두개의 무작위 아이템을 뱉는 스크립트를 포함한 동시에 넘어지는 목적에 특화된 가상의 대역 배우 --으로 교체하는 것이 훨씬 쉽습니다. 이것이 바로 우리가 곧 착수할 내용입니다.


경비 로봇이 쓰러지고 있습니다.

위의 이미지는 앞서 말한 실제 로봇 대신 활약하고 있는 대역 Prefab를 보여주고 있습니다.

이 대역을 존재케 하는 스크립트는 EnemyDamage 스크립트이기 때문에, 좀 더 이 스크립트에 대해 좀 더 알아보도록 합시다...

게임 객체에 ApplyDamage 메시지가 전달되면, ApplyDamage() 함수가 호출됩니다. 만약 로봇이 너무 많은 타격을 받았다면 -- 본 예제에서는 로봇의 체력은 3으로 설정되어 있습니다 -- Die() 함수를 호출하며, 이 부분이 바로 재미있는 일이 시작되는 부분입니다.

Die() 함수는 먼저 우리의 Copper 게임 객체를 파괴하도록 표시합니다. (객체의 파괴는 Update() 함수가 끝날 때까지 실행되지 않기 때문에 함수의 초반부터 파괴가 진행되지 않는 데에는 그 외에 다른 이유가 없습니다.)

다음 대역 Prefab이 인스턴스화 되고 현재 로봇의 위치-- 머리부터 몸체, 그리고 팔까지를 포함한 모든 하위 객체의 위치--가 대역 Prefab에 복제되어 집니다.

불꽃 폭발은 그냥 또 다른 파티클 시스템 에셋입니다. 이 폭발은 인스턴스 화된 후 만들어진 죽는 로봇 게임객체의 하위객체가 되어 정확한 위치에서 올바르게 정렬된 상태에서 나타나도록 합니다.

이제 모든 인스턴스들이 자리에 있는 상태에서 해야 할 다음 단계는 플레이어로 부터 밀려나는 효과를 주어 유니티의 물리엔진이 로봇을 넘어지고 굴러다니도록 할 수 있게 해야 합니다.

마지막으로, 최대 2개의 아이템을 50:50의 확률로 체력아이템 또는 연료통 아이템으로 인스턴스화 하여 무작위 방향으로 공중에 발사할 것입니다.

이 모든 것을 Copper 게임 객체를 선택하고 Enemy Damage 구성요소의 값을 수정하는 것으로 구현할 수 있습니다. 우리는 사용자가 다른 변화된 값들을 적용해보기를 권장합니다.


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

떨어뜨릴 수 있는 아이템과 물리

로봇이 넘어졌을 때 나타나는 아이템은 이 전에 만들어 두었던 Prefab들에서 부터 유래되지만, 파티클 효과와 움직임과 충돌을 관리하는 스크립트인 DroppableMover가 추가됩니다.

이 스크립트가 필요한 이유는 컬라이더는 아이템을 줍는 목적으로 트리거로 설정되어 있어 물리 엔진의 영향을 받지 않기 때문입니다. 아이템에겐 기본 속도가 주어진 후 스크립트는 레이캐스팅--아래 부분에 가상의 선을 그려 아이템이 지면에 닿는지를 체크--을 사용합니다. 이것이 실행되면, 스크립트는 비활성화 됩니다. (이 코드는 하나의 단점을 가지고 있는데, 그것은 바로 이 스크립트는 오직 아래로만, 즉 Y축으로만 체크한다는 것입니다. 그러므로 떨어뜨릴 수 있는 아이템은 벽에 박혀 버릴수도 있습니다.)

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



스포닝 그리고 최적화

플레이어와의 지정된 거리 내에서 적을 스포닝 하는 것은 초창기 컴퓨터와 비디오 게임에 사용되었던 오래된 기술로서 모든 적의 상태를 저장해야하는 필요성을 없앴습니다. 우리 또한 이 기술을 사용하여 프로세서에 오는 부담을 줄일 수 있습니다. 플레이어에 시야에 보이지 않은 로봇들을 삭제함으로서, 불필요하게 스크립트와 AI를 실행하는 것을 피할 수 있습니다.

시작해봅시다:

ㅁ Hierarchy Pane의 가장 상위 레벨에 빈 게임 객체를 생성합니다.

ㅁ CopperSpawn이라고 이름 붙입니다.

ㅁ EnemyRespawn 스크립트를 객체에 드래그 해 넣습니다.

ㅁ CopperSpawn 객체를 로봇이 나타나게 하고 싶은 곳에 위치시킵니다. (씬 뷰에서는 객체가 스포닝의 범위를 표시하는 구체와 함께 작은 로봇 아이콘으로 표시되어있습니다. 이들은 EnemyRespawn 스크립트에 의해 그려졌습니다.)

ㅁ 객체의 설정을 아래와 같이 수정합니다.


CopperSpawn의 설정.

우리는 소수의 이러한 게임 객체들이 필요할 것이므로, 상위 게임 객체를 만들어 CopperSpawn을 이 객체의 하위 객체가 되도록 합시다..

ㅁ Hierarchy Pane의 가장 상위 레벨에 빈 게임 객체를 생성합니다.

ㅁ 이 새 객체를 Enemies라고 이름 붙입니다.

ㅁ CopperSpawn 게임 객체를 Enemies로 드래그 시켜 하위 객체로 만듭니다.

ㅁ 이제 CopperSpawn 게임 객체를 이용하여 Prefab을 만듭니다. 이 Prefab의 인스턴스들을 레벨 전역에 위치시킵니다.


☆ 참고

이 기술의 부작용 하나는 플레이어가 로봇을 죽이고 바로 범위에서 벗어나면, 로봇은 원래에 자리로 새것처럼 나타날 것입니다.


어떻게 작동하는가

CopperSpawn 게임 객체는 만약 플레이어가 범위 내에 접근하는 지 체크하고 그럴 경우 Copper Prefab의 인스턴스를 생성하는 스크립트를 포함하고 있습니다. 플레이어가 범위 밖으로 나가면 우리의 로봇 스포닝 스크립 트는 자동으로 로봇을 무대에서 없앨 것입니다.

이러한 기능을 가진 스크립트는 바로 EnemyRespawn입니다. 이 스크립트는 수많은 주석을 포함하고 있지만, 두 가지의 주요 함수는:

Start() -- 나중에 수정이 필요한 플레이어 게임객체의 변형과 연결하는 링크를 저장합니다.

Update() -- 먼저 플레이어가 범위 내에 있는지 체크하여 참이면 로봇을 인스턴스화 합니다. 거짓이며 플레이어가 범위 밖으로 벗어났다면 로봇 Prefab은 파괴됩니다.

또한 편집기에서 사용되는 두개의 기즈모 기능이 있습니다.

EnemyRespawn 또한 유니티의 "기즈모" 기능을 사용합니다. 기즈모는 주로 게임 내에서 보단 씬 뷰에서만 표시되는 시각적 도움을 주는 장치로서 본 게임에서는 스폰 범위를 보여주는 구체를 보여주고 있습니다.

본 스크립트에서는 두 가지 종류의 기즈모가 있는데, 첫 번째는 로봇의 아이콘을 그려낸 후 마우스로 아이콘을 클릭하였을 때 스폰된 객체를 선택하게 해줍니다:

☆ 참고

아이콘의 이미지는 [프로젝트의 경로]/Assets/Gizmos에 저장되어있습니다.


로봇 아이콘을 보여주는 OnDrawGizmos() 함수.

아이콘을 구현하기 위한 기즈모의 코드는 아래와 같습니다:

==============================================================================

function OnDrawGizmos ()
{
     Gizmos.color = Color(1, 1, 1, 1);
     Gizmos.DrawIcon(transform.position, gizmoName + ".psd");
}

==============================================================================

매번 유니티 편집기의 GUI가 업데이트 되거나 새로 고쳐지면 OnDrawGizmos() 함수가 호출되어 아이콘이 언제나 보이도록 합니다. 이 함수가 어떠한 아이콘 이미지를 사용하는지 알려주기 위해서 우리는...

ㅁ ...Inspector의 Gizmo Name 속성을 "Copper"로 설정해 주어야 합니다.

반대로, OnDrawGizmosSelected() 함수는 유니티 편집기 GUI에 의해 객체가 선택되었을 때만 호출됩니다. 객체가 선택되어 있는 동안은 유니티 편집기 GUI가 업데이트 또는 새로 고쳐지는 매 시간에 호출될 것입니다.

본 예제에서는, 함수는 spawnRange를 구체의 반지름으로서 정의하여 구체를 그립니다. 그렇게 함으로서 로봇이 인스턴스화 되는 시각적 범위의 표시가 제공됩니다. 플레이어가 이 구체 밖으로 벗어나면, 로봇은 자동으로 파괴될 것입니다.


==============================================================================

function OnDrawGizmosSelected ()
{
     Gizmos.color = Color(0, 1, 1);
     Gizmos.DrawWireSphere(transform.position, spawnRange);
}

==============================================================================


OnDrawGizmoSelected() 함수가 Spawn Range 변수에 의해 정의된 구체를 보여주고 있습니다.


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

다른 최적화 방법


위의 테크닉 외에 추가적으로, 유니티는 OnBecameVisible() 함수와 OnBecameInvisible() 함수를 제공합니다. 그러나 우리의 리스포닝 테크닉과는 달리, 위의 함수들은 플레이어 객체보다 카메라의 방향과 다른 설정에 기반을 두고 있습니다. 이는 OnBecameInvisible()가 카메라가 그저 방향을 바꿨다는 이유만으로 객체에 호출됨을 의미합니다. 이러한 상황은 사용자가 원하는 상황이 아닐지도 모릅니다.

우리가 사용하는 방법보다 더욱 최적화된 다른 테크닉은, 스크립트 코드를 이용해 플레이어의 위치를 확인하는 대신 컬라이더 구성요소를 트리거로 사용하는 것입니다. 유니티는 이를 위해 OnTriggerEnter()와 OnTriggerExit() 함수를 제공합니다. 그러나 만약 사용자가 컬라이더를 다른 용도에 사용하기 위해 리스폰 스크립트를 객체에 첨부하길 원한다면 이 방법은 실행이 불가능 할지도 모릅니다.

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


본 튜토리얼 번역서는 (주)지피엠스튜디오가 운영하는 "유니티코리아" 회원님들을 위한 메뉴얼 번역 자료 입니다.
본 자료를 다른 곳에 개제 하실 때에는 아래의 번역과 출처를 명확히 밝혀 주시기 바랍니다.
본 자료는 제3자가 상업적인 용도로 사용 할 수 없음을 밝힙니다.

번역 :
유니티코리아 [U3K]게임인생
출처 : 유니티코리아(www.unity3dkorea.com)

적(Adversaries) 챕터가 완료되었습니다. 다음 챕터에서는 오디오와 마무리 작업 (Audio and Finishing Touches)를 연재하겠습니다.


저작자표시 비영리 변경금지 (새창열림)

'Game Engine > Unity' 카테고리의 다른 글

No.10 Unity 3D Platform Tutorial "Audio & Finishing Touches #2"  (0) 2010.08.09
No.9 Unity 3D Platform Tutorial "Audio & Finishing Touches #1"  (0) 2010.08.09
No.7 Unity 3D Platform Tutorial "The GUI #2"  (0) 2010.08.09
No.6 Unity 3D Platform Tutorial "The GUI #1"  (0) 2010.08.09
No.5 Unity 3D Platform Tutorial "Setting the Scenes"  (0) 2010.08.09
    'Game Engine/Unity' 카테고리의 다른 글
    • No.10 Unity 3D Platform Tutorial "Audio & Finishing Touches #2"
    • No.9 Unity 3D Platform Tutorial "Audio & Finishing Touches #1"
    • No.7 Unity 3D Platform Tutorial "The GUI #2"
    • No.6 Unity 3D Platform Tutorial "The GUI #1"
    VFX-KARA
    VFX-KARA
    Effect 디자이너 KARA

    티스토리툴바