스터디/Unity 2016. 9. 19. 17:10

[유니티] Playmaker

유니티용 플러그인 Playmaker를 질렀다 (65달러에서 45달러로 할인중이었음)

프로세싱으로 만들어둔 데모를 이제 본격 유니티의 세상으로 옮겨야하는데 java랑 C#이 그나마 비슷하다고는 해도 새로 배워야할 개념이 많아져서 허우적대는중

비주얼 프로그래밍이라고해서 Max/msp 같은건가 싶었는데 FSM 개념을 담은 Flow-chart?..

State Action Event간의 관계가 헷갈려서 듣던 튜토리얼을 멈추고 블로그를 뒤적거리며 개념 정리하는 중.



[데브루키] 유니티와 Play maker를 이용한 쉽고 빠른 게임 개발 - Slideshare

introduce unity3D and playmaker basic - Slideshare

Hutong Games사의 튜토리얼 페이지



  • 함수 단위가 아닌 FSM 단위로 비주얼 프로그래밍 가능

  • GameObject FSM (Finite State Machine : 유한상태기계) 컴포넌트 하나 추가한 것이 하나의 FSM 객체가 된다. 한 게임 오브젝트에 여러 FSM 객체를 만들수도 있으며 일종의 레이어처럼 사용할수있다 (FSM1 캐릭터의 상태 변화제어, FSM2 캐릭터의 행동변화 제어)

  • FSM : State가 특정하게 제한된 것을 Finite State라 하며, 정해진 절차에 따라 반복적으로 그 일을 수행하는 Machine



  • State : FSM에서 하나의 상태를 표현하는 객체. 여러 action과 transitino으로 구성됨
  • Action : State에서 수행할 하나의 작업을 표현하는 객체. (오브젝트 이동 회전 등등등)
  • Transition : State에서 다른 State로의 이동. Transition에 지정된 Event가 발생했을때 다음 State로 넘어감
  • Event : Mouse down..FINISHED 등
  • Variable : 변수(Global도 따로 지정 가능). FSM이 아닌 곳에서도 객체 참조하여 값 얻을수 있음 


  • Animation event를 Playmaker로 전달 : animation event 함수를 PlaymakerFSM 함수중 SendEvent로 지정

  • 모든 PlayMakerFSM 컴포넌트로부터 Action 조회하기

foreach (var fsm in Component.FindObjectsOfType<PlayMakerFSM>())
{
    if (!fsm.Fsm.Initialized)
        fsm.Fsm.InitData();

    foreach (var state in fsm.FsmStates)
    {
        foreach (var action in state.Actions)
        {
            // use action
        }
    }
}

  • 마우스 클릭한 위치에 있는 오브젝트 찾아서 PlayMakerFSM에 이벤트 전달

if(Input.GetMouseButton(0)) {
   ray = Camera.main.ScreenPointToRay(Input.mousePosition);
   if (Physics.Raycast(ray, out hit, 5000)) {
    Debug.Log("name : " + hit.collider.name);
    //PlayMakerFSM fsm = hit.collider.GetComponent<PlayMakerFSM>();
    //fsm.SendEvent("이벤트명");

   }
  }


스터디/Unity 2016. 9. 17. 20:10

[자료] 유니티 UI 디자인 교과서 - 예제 코드


유니티 내장 UI 프레임워크 uGUI


책 링크 (http://wikibook.co.kr/UGUI/)

GitHub (https://github.com/wikibook/ugui


Chapter 1

  • Rigid Body의 Is Kinematic : 다른 오브젝트에 물리적 작용은 하지만 자신은 공간에 멈춰 있음

  • float yAngle = rotationSpeed * Time.deltaTime;   

    transform (0.0f, yAngle, 0.0f);

    //Time.deltaTime은 이전 프레임이 끝난 후 지금까지의 시간(초)


  • 인스펙터 뷰에서 private이나 protect 값이라도 앞에 [SerializeField] 넣으면 수치 변경 가능 
  • CubeGenerator
  •  


    public class CubeGenerator : MonoBehaviour

    {
        [SerializeField] private GameObject cubePrefab;    // 상자 프리팹
        
        public void Generate()
        {
            // 상자 프리팹을 인스턴스로 만든다
            GameObject obj = Instantiate(cubePrefab) as GameObject;
            // 인스턴스를 「CubeGenerator」오브젝트의 자식 형태로 추가
            obj.transform.SetParent(transform);
            // 인스턴스의 스케일을 프리팹에 맞춘다
            obj.transform.localScale = cubePrefab.transform.localScale;
            // 인스턴스의 위치를 CubeGenerator 오브젝트에 맞춘다
            obj.transform.position = transform.position;
            // 떨어질 때마다 변화하도록 회전 각도를 무작위로 지정
            obj.transform.rotation = Random.rotation;
        }
    }

  • Input Controller 
  •  using UnityEngine;


    public class InputController : MonoBehaviour
    {
        void Update()
        {
            if(!Application.isMobilePlatform)
            {
                // 모바일 플랫폼이 아닐  실시할 처리
                if(Input.GetMouseButtonUp(0))
                {
                    // 마우스 왼쪽 버튼을 눌렀다  상태라면
                    // CubeGenerator 컴포넌트에 포함된 Generate 메서드 호출
                    GetComponent<CubeGenerator>().Generate();
                }
            }
            else
            {
                // 모바일 플랫폼일  실시할 처리
                if(Input.touchCount >= 1)
                {
                    Touch touch = Input.GetTouch(0);
                    if(touch.phase == TouchPhase.Began)
                    {
                        // 터치가 시작된 상태라면 CubeGenerator 컴포넌트에 포함된
                        // Generate 메서드를 호출
                        GetComponent<CubeGenerator>().Generate();
                    }
                }
            }
        }
    }

  • 이벤트 메서드 
  • - Awake : 오브젝트의 인스턴스가 로드됐을 때 한번 호출.  씬에 배치된 게임오브젝트에 추가된 스크립트라면 씬이 시작될때 호출되고 프리팹에 추가된 스크립트라면 인스턴스로 만들어진 직후에 호출됨. 비활성화일때는 호출되지 않고 처음 활성화된 시점에 호출  

    - Start : 첫프레임이 지나가기전 한번만 호출

    - FixedUpdate : 게임 오브젝트가 활성화되어있는 동안 고정 프레임율에 맞춰 호출

    - Update : 게임오즈젝트가 활성화되어있는 동안 프레임마다 호출

    - LateUpdate : 프레임마다 Update 메서드가 처리를 끝내면 LastUpdate 메서드가 호출됨. Update 메서드에서 변경된 내용을 처리에 반영하고 싶을떄 사용 

    - Awake가 호출된 시점에서 생성될 오브젝트의 인스턴스는 모두 생성된 상태가 되므로 이 시점에서 다른 오브젝트를 참조할수는 있으나 각 오브젝트에 연관된 Awake 메서드가 호출되는 순서가 정해진 것이 아니므로 참조되는쪽 오브젝트 처리가 안끝났을수도 있음. Awake메서드에서는 자신의 초기화 하고나서 다른 오브젝트로 연결되는 참조를 얻어내기만 하고 정보를 얻어내는 일은 나중에 호출되는 Start에서 하는 것 권장 


Chapter 2


  • 레이어별 렌더링 순서를 코드로 변경 

    obj.transform.SetAsFirstSibling(); //맨먼저 렌더링. 가장아래쪽.

    obj.transform.SetAsLastSibling(); //맨나중에렌더링. 가장위쪽

    obj.transform.SetSiblingIndex(2);  //계층에서 3번째요소가 되는 위치에. 아래에서 세번째로 렌더링.


  • 캔버스 렌더링 모드 
  • - Screen Space 

     : Overlay 모드. 화면 전체 덮는 레이어. Pixel perfect는 선명하나 퍼포먼스 많이 차지. Sort Order 는 0부터 아래쪽 순서로

     : Camera 모드 : 지정된 카메라와 일정한 거리만큼 떨어져 렌더링됨. Sorting Layer 추가하여 거리와 상관없이 렌더링 순서 제어 가능. 

    - World Space 모드 : 다른 게임 오브젝트와 동일한 자격. 



[HCI] Radical Atoms : hiroshi ishii, MIT MEDIA LAB

올해 오스트리아에서 열리는 Art Electronica 에서 실시간 라이브로 MIT media lab의  Hiroshi ishii 교수님의 세미나를 보여줘서 잠시 한던 일을 멈추고 구경중

요즘 Tangible 쪽 논문을 많이 보고있는데 이미 이 랩에서는 이 토픽도 옛날 과거가 되어버렸다. 

GUI > TUI > RADICAL ATOMS의 Evolution에서  아직 Radical Atoms라는 단어가 아무리 자꾸 봐도 확 와닿지 않는 이유는 내가 이제 겨우 GUI에서 TUI로 넘어가 공부하고 있는 단계이기 때문이겄지.. 어서 공부해서 담 계단을 올라가야지

강연에서는 이미 논문과 영상으로 본적있는 프로젝트들을 소개하고 있긴하지만, 큰 컨텍스트 안에서 흐름을 볼수있어서 좋았음 

페스티벌 현장에서는 20주년 기념으로 옛날 대표 프로젝트 몇개들을 스페셜 에디션으로 다시 만들어서 전시도 하고 새로운 컨셉들도 선보이고 있는듯..

언제쯤 직접 가볼수있을까...

http://www.aec.at/radicalatoms/en/live/