반응형

유나이트 벤쿠버 2013에서 2D 게임에 최적화된 엔진 공개, 전 세계 주목

 

유니티 테크놀로지스(Unity Technologies / 이하유니티)는 지난 29일 유나이트 벤쿠버 2013(Unite Vancouver 2013)에서새로운 2D 개발 툴과 유니티 엔진 및 에디터 워크플로우를 공개했다.이는 2D 게임 개발 시 제기되었던 문제들을 해결하기 위해 디자인 된 버전이다. 유니티 무료 버전에 포함되어 있는 2D 툴로는 새로운 버전이며, 올 가을에 출시될 유니티 4.3 업데이트와 함께 공개될 예정이다. 

최근, 게임개발자들 사이에서 모바일 게임 개발 바람이 불면서 2D 게임의 인기가 상승했고 2D에 대한 개발 툴과 작업 수요 역시 증가했다. 이번 버전의 특징은, 유니티 엔진을 사용하여 2D 개발을 진행하기에 수월하도록 유용성과효율성이 향상 되었다는 것이다. 

유니티 CEO 데이비드헬가슨(David Helgason)은 “우리는 모든 개발자들이유니티 엔진을 손쉽게 사용할 수 있도록 끊임없이 힘써왔다. 유니티 엔진이 다양한 2D 프로젝트에서 사용되어 ‘유니티2D 엔진’의 질을 향상시키기 위해 지속적으로 노력할 것이다”라고 밝혔다. 

더불어, 2D 에셋으로작업 시 새로운 스프라이트 텍스쳐 임포터 타입과 2D 전용 렌더러의 구성 요소의 추가로 가져오기(importing), 조작하기(manipulating) 등이 더욱수월해진다. 일정 씬(scene)에 2D 아트를 추가하여 에셋 라이브러리에서 유니티가 자동적으로 사물을 생성하도록 스프라이트 드래그를 더욱 손쉽게만들어준다. 

유니티 애니메이션 에디터에서는 “도프 시트(dope sheet)” 기능과 복잡한 애니메이션을 보다잘 관리할 수 있도록 비주얼 스트라이프 애니메이션 에디팅(visual sprite animationediting) 기능이 업그레이드 되었다. 

추가적으로 Box 2D물리 엔진이 유니티로 통합되었는데, 이는 뛰어난 성능, 보다안정적인 시뮬레이션 및 축소된 게임 빌드 등을 의미한다. 스프라이트 텍스쳐에서 폴리곤 콜라이더 제너레이션(polygon collider generation)은 일정 씬 안에서 개체들 사이의 정교한 물리적 반응을 끌어내기위해 물리적 콜라이더 메쉬(physical collider meshes)를 빠르고 정확하게 만들어 내면서편집 기능까지 가능하게 했다. 

유니티 CTO 여호와킴안테(Joachim Ante)는 “유니티는 이미 3D 게임을 만들기 위한 훌륭한 툴이며, 2D에서도 동일하게 활용될수 있는지 확인하고 싶었다”고 전했다. “2D와 3D를 쉽게 믹스 매치할 수 있다는 점은 개발자들 사이에서 유니티가 독보적이고 강력한 도구로 자리매김 하도록만들 것이다.”라고 덧붙였다.

 

‘유니티 2D 엔진’에 대한 보다 자세한 내용은 http://blogs.unity3d.com/2013/08/28/unity-native-2d-tools/에서 확인할 수 있다. 

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


자막 옵션 켜시고 한글로 번역해서 보시면 엉성한 번역이지만... 나름 이해가 될겁니다. 

반응형
반응형

공식홈페이지 링크



AddComponentMenu : 유니티 메뉴 추가.

// C# example:
[AddComponentMenu("Transform/Follow Transform")]
public class FollowTransform : MonoBehaviour
{
}


ContextMenu : 우클릭 메뉴 추가.

// C# example:
public class ContextTesting : MonoBehaviour {
    /// Add a context menu named "Do Something" in the inspector
    /// of the attached script.
    [ContextMenu ("Do Something")]
    void DoSomething () {
        Debug.Log ("Perform operation");
    }
}


ExecuteInEditMode : 에디트 모드에서 스크립트 실행.

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class example : MonoBehaviour {
    public Transform target;
    void Update() {
        if (target)
            transform.LookAt(target);
        
    }
}


HideInInspector : 인스펙터에서 속성 감추기, 이전 세팅값은 유지.

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    [HideInInspector]
    public int p = 5;
}


NonSerialized : 인스펙터에서 속성 감추기, 이전 세팅값은 무시.

// C# Example
class Test {
    // p will not be shown in the inspector or serialized
    [System.NonSerialized]
    public int p = 5;
}


RPC : 원격지 호출 함수로 지정, 보내는 쪽과 받는 쪽 모두 다 존재해야 함.

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    public Transform cubePrefab;
    void OnGUI() {
        if (GUILayout.Button("SpawnBox")) {
            NetworkViewID viewID = Network.AllocateViewID();
            networkView.RPC("SpawnBox", RPCMode.AllBuffered, viewID, transform.position);
        }
    }
    [RPC]
    void SpawnBox(NetworkViewID viewID, Vector3 location) {
        Transform clone;
        clone = Instantiate(cubePrefab, location, Quaternion.identity) as Transform as Transform;
        NetworkView nView;
        nView = clone.GetComponent<NetworkView>();
        nView.viewID = viewID;
    }
}


RequireComponent : 컴포넌트 자동 추가.

[RequireComponent (typeof (Rigidbody))]
public class PlayerScript : MonoBehaviour {
    void FixedUpdate()  {
        rigidbody.AddForce(Vector3.up);
    }
}


Serializable : 인스펙터에 인스턴스의 하위 속성 노출.

// C# Example
[System.Serializable]
class Test
{
    public int p = 5;
    public Color c = Color.white;
}

class Sample : MonoBehaviour 
{
    public Test serializableObj; // 인스펙터에 p, c가 노출된다.
}


SerializeField : 인스펙터에 비공개 멤버 노출.

//C# example
using UnityEngine;

public class SomePerson : MonoBehaviour {
    //This field gets serialized because it is public.
    public string name = "John";

    //This field does not get serialized because it is private.
    private int age = 40;

    //This field gets serialized even though it is private
    //because it has the SerializeField attribute applied.
    [SerializeField]
    private bool hasHealthPotion = true;

    void Update () {
    }
}

출처 : http://www.uzoo.in/index.php?mid=master_codesnippet&order_type=desc&document_srl=531&listStyle=viewer#

반응형
반응형
1. 프로파일러를 이용해서 병목현상 체크하기.
 - Window > Profiler 메뉴를 이용한다.

2. 컬링 기법 이용하기.
 - 프러스텀 컬링 (Frustum Culling) : 레이어별로 컬링 거리를 따로 지정 가능하다.
 - 오클루전 컬링 (Occlusion Culling) : Window > Occlusion Culling 메뉴를 이용한다.

3. 드로우콜 체크하기.
 - 드로우콜은 게임 오브젝트에 설정된 재질의 셰이더 패스당 하나씩 일어난다.
 - 렌더러에 사용한 재질의 수만큼 드로우콜이 발생한다.
 - 드로우콜의 발생을 최소화하기 위해서는 성질이 동일한 물체들은 하나의 메쉬와 재질을 사용하도록 통합하는 것이다.
   (이를 위해 최상위 오브젝트에 사용할 수 있는 CombineChildren 컴포넌트가 Scripts 패키지에서 제공된다.)
 - CombineChildren 컴포넌트를 사용할 경우, 하위 오브젝트가 모두 하나가 되어서 빛의 계산을 모두 수행하는 등 불필요한 계산이 발생하는 단점도 있다.
 - 같은 셰이더를 사용하더라도 다른 텍스처를 사용하면 드로우콜이 증가한다.
 - 위와 같은 경우, 텍스처를 모두 합친 큰 텍스처(텍스처 아틀라스)를 만들어 서로 공유하면 드로우콜을 줄일 수 있다.

4. 배칭기능 사용하기.
 - Edit > Project Settings > Player 에서 설정.
 - 정적 배칭을 사용할 경우, static으로 설정된 게임 오브젝트에서 동일한 재질을 사용하는 물체가 있는 경우 자동으로 통합한다.
 - 정적 배칭을 사용할 경우, CombineChildren처럼 통합되는 오브젝트를 모두 하나의 커다란 메쉬로 만들어서 따로 저장하게 된다. (메모리 사용 증가)
 - 동적 배칭은 움직이는 물체를 대상으로 동일한 재질을 사용하는 경우, 자동으로 메쉬를 통합하여 드로우콜을 줄여주는 기능이다.
 - 동적 배칭은 계산양이 많으므로, 정점이 900개 미만인 오브젝트만을 대상으로 수행된다.

5. 권장 텍스처 사용하기.
 - 아이폰 (PowerVR) : PVRTC
 - 안드로이드 (Tegra) : DXT
 - 안드로이드 (Adreno) : ATC
 - 안드로이드 (공통) : ETC1

6. 오버드로우
 - 겹치는 부분의 픽셀을 다시 그리는 것을 오버드로우라고 한다.
 - 오버드로우를 줄이는 가장 좋은 방법은 큰 영역을 차지하는 물체를 먼저 그리도록 하는 것이다.

7. 물리엔진
 - 유니티에서는 물리 엔진 작업을 렌더링 작업과 별개로 수행한다.
 - 물리 엔진 작업은 FixedUpdate() 함수에서 수행되며, 0.02초로 매우 짧아서 FixedUpdate() 함수가 여러 번 수행된 후 Update() 함수가 호출된다.
 - 따라서 FixedUpdate() 함수의 코드에는 필요한 기능만 넣도록 한다.
 - 게임 진행에 문제가 없다면 Edit > Project Settings > Time 메뉴에서 FixedUpdate() 함수의 실행 주기를 늘리는 것도 좋다.

8. 충돌체의 이동
 - 리지드 바디가 없는 고정 충돌체를 움직이면 CPU에 부하가 발생된다.
 - 이 경우, 리지드 바디를 추가하고 IsKinematics 옵션을 준 후 움직이는 것이 좋다.

9. Maximum Allowed timestep 조절
 - 여타 요인으로 시스템에 부하가 걸려 지정된 시간보다 오래 멈출 경우, 물리 계산을 건너뛰도록 설정하는 기능.
 - Edit > Project Settings > Time 메뉴에서 설정.

10. Solver Iteration Count 조절
 - 물리 관련 계산을 얼마나 정교하게 할 것인지 지정. ( 높을수록 정교해진다. )
 - Edit > Project Settings > Physics 메뉴에서 설정.

11. Sleep 조절
 - 리지드 바디의 속력이 지정된 수치보다 작을 경우, 자동으로 휴면 상태에 들어간다.
 - Edit > Project Settings > Physics 메뉴에서 설정.
 - Physics.Sleep() 함수를 이용해서 강제 휴면 상태를 만들 수도 있다. 
   (Awake()함수에서 사용하면 레벨이 로딩되기 전까지 물리 엔진 사용을 자제시킬 수 있다.)

12. 유니티 라이브러리 사용 시 주의사항
 - 유니티의 핵심기능은 모두 c++로 작성되어 있다.
 - 예를 들어 transform.position 에서 transform은 c#의 속성으로 정의되어 있고 position은 c++영역에 작성되어 있다.
 - 때문에 transform.position 구문을 자주 사용하는 것보다 미리 변수에 저장해두고 사용하는 방식이 좋다.
 - FindObject 계열 함수들은 매우 느리다. ( 미리 찾아서 저장해두는게 좋다. )
 - Instantiate 와 Destroy 함수를 이용한 프리팹의 생성과 소멸은 비용이 크다. ( 활성화와 비활성화를 이용하는 것이 좋다. )
 - 가급적이면 Update 함수보다 CoRoutine 함수를 사용하도록 한다.
 - 박싱과 언박싱은 부하가 큰 작업이다.
 - 나눗셈보다는 곱셈이 몇십배 빠르다.
 - magnitude 보다 sqrMagnitude를 사용해서 제곱근 계산을 줄이도록 한다.
 - 삼각함수의 값은 상수로 저장해두고 사용하는 게 좋다.
 - 고정 문자열은 readonly 혹은 const 키워드를 사용하여 가비지 컬렉션으로 부터 벗어나도록 한다.

13. 배열 관리
 - Array : 아이템들의 크기가 일정하고, 순서가 변할 일이 없다면 일반 배열을 사용하는 것이 가장 빠르게 동작한다.
 - ArrayList : 아이템들의 크기가 자주 변하고 순서도 자주 바뀌는데다, 모든 아이템이 레퍼런스형일 경우 사용한다.
 - List<T> : ArrayList인데 저장하는 데이터가 밸류 타입이면 제네릭 List를 사용해야 박싱이 일어나지 않는다.
 - Hashtable : 키와 값으로 구성된 사전류의 데이터를 관리할 때 해시 테이블을 사용하면 편리하다.
 - Dictionary<K, V> : 해시 테이블과 동일한 기능을 수행하나, 데이터의 형식이 밸류 타입이면 제네릭 Dictionary를 사용해야 박싱이 일어나지 않는다.

출처 : http://www.uzoo.in/?mid=master_codesnippet&order_type=desc&document_srl=539&listStyle=viewer#


반응형

+ Recent posts