2017년 5월 29일 월요일

Unity 개발 팁 - isDebugBuild, EditorOnly Tag

빠르게 개발 할 때 많이 사용하고 있는 것이 있어서 개발팁으로 남긴다.

#1
Debug.isDebugBuild
빌드가 디버그 빌드라면 true 를 반환 하기 때문에 여러가지 확인용으로 사용할 수 있다.

샘플 코드

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        if (Debug.isDebugBuild)
            Debug.Log("This is a debug build!");
        
    }
}

참고 문서
https://docs.unity3d.com/ScriptReference/Debug-isDebugBuild.html


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

#2
게임 Obeject의 Tag를 EditorOnly 로 지정하면
해당 오브젝트는 Editor 상에서만 사용하고,
실제로 빌드하면 해당 태그가 지정된 오브젝트는 제외되고 빌드되어 편리하다.
테스트용으로 필요하여 하이어라키에 추가해둔 오브젝트를 일일히 삭제할 필요가 없다.

2017년 5월 25일 목요일

Unity 키보드로 히든 키 입력하기

특정 키를 입력받고 있다가 정답이 되면 true 를 돌려주는 간단한 코드.
Start()에 입력된 값을 바꾸거나, Inspector 에서 적당히 미리 정답 값을 입력해두면 된다.

재미로 만들었다. 어딘가에 적당히 써보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HiddenKeyInput : MonoBehaviour {

    public bool _key = false;

    public List _pool, _seikai;

    void Start()
    {
        // 정답
        // 왼쪽시프트 + 상하좌우AB 를 순서대로 누른다.
        // _key 가 트루가 된다.
        // 시프트를 떼면 리셋, _key 가 false 가 되고 _pool 에 쌓여있던 내용도 초기화 된다.
        _seikai.Add("상");
        _seikai.Add("하");
        _seikai.Add("좌");
        _seikai.Add("우");
        _seikai.Add("에이");
        _seikai.Add("비");
    }

    // Update is called once per frame
    void Update () {

        if (Input.GetKey(KeyCode.LeftShift))
        {
            if (Input.GetKeyDown(KeyCode.UpArrow))
            {
                _pool.Add("상");
                Debug.Log("상");
            }
            if (Input.GetKeyDown(KeyCode.DownArrow))
            {
                _pool.Add("하");
                Debug.Log("하");
            }
            if (Input.GetKeyDown(KeyCode.LeftArrow))
            {
                _pool.Add("좌");
                Debug.Log("좌");
            }
            if (Input.GetKeyDown(KeyCode.RightArrow))
            {
                _pool.Add("우");
                Debug.Log("우");
            }
            if (Input.GetKeyDown(KeyCode.A))
            {
                _pool.Add("에이");
                Debug.Log("에이");
            }
            if (Input.GetKeyDown(KeyCode.B))
            {
                _pool.Add("비");
                Debug.Log("비");
            }

            if (_seikai.Count == _pool.Count)
            {
                
                for (int i = 0; i < _seikai.Count; i++)
                {
                    if (_seikai[i] == _pool[i])
                    {
                        if (i == _seikai.Count - 1)
                            _key = true;
                    }
                    else
                    {
                        break;
                    }
                }

            }
            
        }
        else
        {
            if (_pool.Count > 0)
            {
                _pool.Clear();
            }
            _key = false;
        }
  
 }
}

2017년 5월 15일 월요일

uGUI EventSystem 을 이용한 Mouse Hover Check

윈도우 프로젝트를 하고 있다보니 마우스 포인터를 감지할 일이 생겼다.
깔끔하고 쉬운 것으로는 Unity 에서 제공하는 컴포넌트를 사용하면 된다.

[1]
Event Trigger 를 이용하여 Pointer Enter / Exit 로 체크하는 방법.
사용할 uGUI 캔버스 안의 UI 오브젝트를 고른다. (hit 가 가능해야 함.)
Add Component 를 눌러서 Event Trigger 컴포넌트를 붙인다.
원하는 이벤트를 사용한다.

[2]
Event System 을 이용하여 전체적으로 확인하는 방법
특정 영역이 아니라 윈도우 안에 액티브 되었는지 확인이 필요하면
EventSystem 에서 IsPointerOverGameObject() 를 통해 확인할 수 있다.
아래는 샘플 코드이다.

public class KpaperTest_EventSystemHover : MonoBehaviour {

    public EventSystem _eventsystem;

 // Use this for initialization
 void Start () {
        _eventsystem = GameObject.Find("EventSystem").GetComponent();

    }
 
 // Update is called once per frame
 void Update () {

        if (_eventsystem.IsPointerOverGameObject())
            Debug.Log("Active!!!");

    }

2017년 5월 12일 금요일

uGUI 에 Image 를 표시하고 Sprite Animation 을 하자

uGUI 에 표시할 수 있는 스프라이트 이미지에는 애니메이터를 붙여도 애니메이션이 되지 않는다.
비용 부담을 신경 쓰지 않고 간단하게 애니메이션을 표시하는 방법으로
SpriteRenderer 로 넘겨주는 Sprite 이미지를 매 업데이트 시점마다 Image 에도 뿌려주면 잘 나온다.

샘플 코드를 해당 image 오브젝트에 붙여두자.
(애니메이터와 스프라이트 랜더러도 붙어있어야 한다.)



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class SpriteRendererToUguiImage : MonoBehaviour {

    [SerializeField]
    private SpriteRenderer _spriteRenderer;

    [SerializeField]
    private Image _image;


 // Use this for initialization
 void Start () {

        if (_spriteRenderer == null)
            _spriteRenderer = this.GetComponent<SpriteRenderer>();

        _spriteRenderer.enabled = false;

        if (_image == null)
            _image = this.GetComponent<Image>();

 }
 
 // Update is called once per frame
 void Update () {

        _image.sprite = _spriteRenderer.sprite;
  
 }
}

2017년 5월 8일 월요일

새 게임 Live2D 모델링 중간 과정

새로 만들고 있는 게임(?)의 모델링 중간 과정
여러가지 시행착오도 겪고 팀원들끼리 감정도 조금씩 닳고 있고
 여러가지를 소모하면서 그래도 열심히 오늘도 게임을 만들고 있다.
 누군가가 재밌어 해주면 정말 좋겠다.
 개발 도중의 스크린샷 (여주인공) Vertex 가 선택된 화면만 보니 왠지 조금 무섭다. ^^;;

하지만 애정(?)을 담아 만들고 있으니까
그래도 비쥬얼은 볼만한 작품이 나올 듯
원화가 친구가 엄청 분발해주고 있어서 나도 자극이 된다.


2017년 5월 2일 화요일

도메인 갱신 실수! (으악)

어느날 갑자기 블로그가 접속이 안되서 일시적인 문제인가 하고 넘어갔는데, 아뿔싸... kpaper.com 도메인 만료일이 지났다. 황급하게 복구 신청. 몇일 뒤면 원래 블로그 주소인 blog.kpaper.com 로 접속이 가능해질 듯..

2017년 4월 25일 화요일

FBX Animation 및 Key Event를 사용하기

최근 작업 중에 3D 캐릭터의 애니메이션 재생이 필요했는데,
상황이 닥치면 하려고 신경쓰고 있지 않다가,
가이드가 살짝 필요한 상황이 되어서 간단히 남겨본다.

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

Unity 는 FBX 파일의 애니메이션 재생이 가능하다.
하지만, FBX 파일 그대로는 ReadOnly 라서 이것을 따로 복제해서 사용해야 한다.

시간이 없어서 일단 글만 먼저 정리!

[FBX 에서 애니메이션 파일을 가져오기]

1. 캐릭터 모델 데이터와 애니메이션 FBX 를 준비한다. (맥스, 마야, 블렌더 등등)

2. 1을 Unity Asset 폴더에 넣는다.

3. Unity 내 Project 탭에서 애니메이션 FBX 를 클릭해서 드롭다운 메뉴를 연다.
Animation 아이콘이 보이면 이것을 Control + D 해서 복제 한다.

4. Hierarchy 에 사용할 3D 캐릭터 모델을 배치

5. 해당 모델에 Animator 를 세팅

6. Animator 에서 움직일 Animation 을 3에서 복제한 Animation 파일로 지정한다.
(FBX 파일 내에 있는 것 말고 복제해서 밖에 생긴 것을 지정)

7. Unity 내에서 WIndow > Animation 탭을 연다.

8. Animation 탭이 열린 상태로 Hierarchy 의 모델 데이터를 클릭하면, 현재 적용된 Animation 을 확인할 수 있고 유니티 내에서 수정도 가능하다.

9. 끝


[Animation Frame에 Key Event 넣기]

FBX 파일 그대로 사용하기는 불가능 (Read Only)하기 때문에 먼저 애니메이션 파일을 복제해두어야 한다. (위 부분 FBX에서 애니메이션 파일을 가져오기를 먼저 한다.)

1. 적당한 C# 스크립트를 하나 만든다.
Ex) AnimationEventManager.cs
public void KeyEventReceiver(GameObject _obj)
        {
            Instantiate(_obj, this.transform, false);
        }

2. 만든 스크립트를 사용할 모델의 게임오브젝트에 add 한다.
(Animator가 붙어있는 gameObject)

3. Unity > Window > Animation 탭에서 Key Event 를 붙이고 싶은 Animation 을 선택한다.

4. Add Key Event 를 선택

5. 만들어진 Key를 클릭해서 Inspector 를 보면 호출할 함수를 풀다운 메뉴에서 선택할 수 있다. (만일 안되면 아까 그 키를 오른 클릭해서 Edit Key Event 선택)
여기에서 아까 만든 스크립트의 KeyEventReceiver() 를 선택한다.

6. 같은 화면의 GameObject 패러미터에 해당 이벤트 동작 시마다 생성할 프리팹을 끌어다 놓는다.

7. 끝.


참고 페이지 : https://docs.unity3d.com/Manual/animeditor-AnimationEvents.html