2016. 2. 25. 14:20

코루틴의 특성


1. 특정 작업을 단계적으로 발생하게 한다.

2. 시간이 흐름에 따라 발생하는 루틴을 작성할 수 있다.

3. 다른 연산이 완료될때까지 기다리는 루틴을 작성할 수 있다.

예를 들어, 컷 씬 시퀀스를 조직하거나 또는 단순히 적이 죽는 애니메이션을 기다린 다음, 재생성을 할 수도 있다.


만약 단지 몇 초 동안 특정 연산을 지연시키기를 원한다면, Invoke를 사용하는 것을 고려해보자..


우선, 확실하게 알고 넘어가자, 코루틴은 쓰레드가 아니다. 코루틴은 비동기가 아니다


헷갈릴수 있는데, 쓰레드는 프로그램에서 다른 쓰레드와 함께 비동기로 실행된다.

멀티프로세서 기계에서, 쓰레드는 실제 다른 쓰레드와 함께 동시에 코드가 실행될 수 있다.


그래서 코루틴이 무엇인가?


코루틴은 쓰레드가 아니다. ,  코루틴은 한번에 하나의 코루틴이 싱행되고, 게임의 메인쓰레드에 맞춰서 실행된다. 사실 함수를 호출하는것처럼 게임의 핵심 기능을 호출하는것과 같다,


따라서 코루틴은 쓰레드가 아니며 비동기도 아니기 때문에 사용할때 절대 동기화나 특정 값을 잠금하는것에 대한 걱정이 필요없다.

당신이 yield를 실행하여 완전히 통제 할 수 있기 때문이다.


따라서 코루틴이란, 부분적으로, 그리고 특정한 상황이 맞아 떨어졌을 때 실행되는 함수로써, 그 작업이 완료가 되기전까지, 미래의 어느시점에 재개 될 수 있는 함수이다.




위에 표를 보면 yield로 끈어준 코루틴들이 각각의 알맞는 상황에 호출된다.


밑에 간단한 코루틴을 보자


1
2
3
4
5
6
7
8
IEnumerator TestCoroutine()
{
      while(true)
      {
           Debug.Log(Time.time);
           yield return null;
      }
}
cs



이 코루틴은 영원히 작동하는 루프를 가지고 있다. 이 코루틴은 현재 시간으로 로그를 남기고, 그 다음 yield한다. 다시 재개될 때, 다시 루프를 돌아서 로그를 남기고, 한번 더 yield될 것이다.


루프안에 있는 코드는 정확하게 Update 함수와 같다. 단지 순서에따라 업데이트 다음에 실행될 뿐이다.


StartCoroutine(TestCoroutine())를 호출할 때, 코드는 첫번째 yield를 만날때까지 즉시 실행되며,

유니티 프로세스가 이 객체에 대해서 코루틴을 처리할 때, 다시 재개된다.


위에 있는 도표에 맞춰 코루틴안에서 호울하는 yield에 따라 다음 호출되는 지점이 달라진단느 것을 알 수 있다.


null - Update구문의 수행이 완료될 때까지 대기한다.


WaitForEndOfFrame - 현재 프레임의 렌더링 작업이 끝날 때까지 대기한다.


WaitForFixedUpdate - FixedUpdate구문의 수행이 완료될 때까지 대기한다.


WaitForSeconds - 지정한 초만큼 대기한다.


WWW - 웹에서 데이터의 전송이 완료될 때까지 대기한다.

(WaitForSeconds or null처럼 재시작한다.)


Another coroutine - 새로운 코루틴은 yielder가 재시작되기 전에 완료 될 것이다.



또한 yield break; 명령어를 실행할 수 있다. 이는 즉시 코루틴을 멈춘다.



요약


코루틴은 시간에 따라 혹은 외부의 처리가 완료되었을 때, 연산이 일어나는 순서를 정하는 정말 멋진 방법이다.


코루틴은 쓰레드가 아니다. 그리고 비동기가 아니다(동시에 일어나지 않는다.)


코루틴이 실행되고 있을 때, 다른 어떤 것들도 실행되지 않는다.


코루틴은 yield 문의 조건을 만족시켰을 때, 재개될 것이다.



Posted by 시리시안
2016. 2. 25. 11:49

함수 

Component GetComponent<type Stirng>

설명

만약 게임 오브젝트에 type에 맞는 컴포넌트가 있다면 그 컴포넌트를 찾아서 돌려주고,, 없으면 null 를 돌려준다


 

1
2
3
4
5
6
7
8
9
10
using UnityEngine;
using System.Collections;
 
public class mGetcomponentExample: MonoBehaviour {
    void Start() {
        Transform mTransform;
        mTransform = gameObject.GetComponent<Transform>();
        mTransform = gameObject.transform;
    }
}
cs


Posted by 시리시안
2016. 2. 25. 11:38

함수 

Component GetComponentInChildren<type>() 

설명

게임오브젝트에서 type 타입의 컴포넌트나 depth-frist 찾기를 해서 얻은 그것의 자녀들 중 가장 빠른 자식을 돌려준다.


오직 활성 컴포넌트만 검사한다. 


1
2
3
4
5
6
7
8
9
10
using UnityEngine;
using System.Collections;
 
public class example : MonoBehaviour {
    public ScriptName mScript;
    void Start() {
        mScript = gameObject.GetComponentInChildren<ScriptName>();
        mScript.DoSomething();
    }
}
cs


Posted by 시리시안
2016. 2. 23. 15:10

절대좌표 연산을 사용하면서 부드러운 회전을 구현하려면 정말 귀찮다.

시작 Quaternion, 목표 Quaternion, Deltatime을 고려해 속도를 구해서 업데이트마다 카운트하면서 더해준다..

하지만 메서드 한방으로 이걸 전부할수있다면?

Quaternion.Slerp(현재 각도, 도착 각도, 속도);


위 메서드의 반환값을 transform.rotation에 대입해주면 된다.

각도에는 모두 Quaternion을 사용한다.



또한 Mathf.Slerp 로 같은 원래로 float도 가능하다.

Vector3도있으니 참고하자.

Posted by 시리시안
2016. 2. 22. 16:50
출처 : http://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html

1
2
3
4
5
6
7
8
9
10
11
12
// Draw a yellow sphere in the scene view at the position
    // on the near plane of the selected camera that is
    // 100 pixels from lower-left.
    using UnityEngine;
using System.Collections;public class ExampleClass : MonoBehaviour {    
    void OnDrawGizmosSelected() {
        Camera camera = GetComponent<Camera>();
        Vector3 p = camera.ScreenToWorldPoint(new Vector3(100100, camera.nearClipPlane));
        Gizmos.color = Color.yellow;
        Gizmos.DrawSphere(p, 0.1F);
    }
}
cs


Posted by 시리시안
2016. 2. 22. 11:37

Recttransfrom이 가지고있는 SizeDelta 를 = new Vector2로 바꾸시면 됩니다.



rectTransform.sizeDelta = new Vector2( yourWidth, yourHeight);


Posted by 시리시안
2016. 2. 22. 10:38


상단에 Edit -> Project Setting -> Quality 에 들어가서


Rendering에 Texture Quality를 확인합시다.


FullRes로 해주면 깨짐 현상이 없어집니다.


(디폴트 세팅을 판타스틱으로 바꿔주시는게 마음편합니다.)

Posted by 시리시안
2016. 2. 22. 05:54

유니티에서 사운드 재생 하기 위해 만든 매니저입니다.


간단한 사운드부터 거리설정 및 포지션 설정 사운드까지 지원합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class SoundManager : MonoBehaviour
{
 
    public AudioClip[] BGMSounds;
    public AudioClip[] EffectSounds;
 
    public bool isSfxMute = false;
    [Range(0.0f, 1.0f)]
    public float sfxVolume = 1.0f;
 
    public Vector3 SoundPlayPosition;
 
    float DefaultMinDistance = 10.0f;
    float DefaultMaxDistance = 30.0f;
    public void SimplePlayBGM(int Index)
    {
        PlaySfx(BGMSounds[Index]);
    }
    public void SimplePlayEffect(int Index)
    {
        PlaySfx(EffectSounds[Index]);
    }
    public void PlaySfx(AudioClip sfx, Vector3 _pos, float _MinDistance, float _MaxDistance, float _Volume)
    {
        if (isSfxMute) return;
 
        GameObject SoundPlayObject = new GameObject("Sfx_" + sfx.name);
        SoundPlayObject.transform.position = _pos;
 
        AudioSource _AudioSource = SoundPlayObject.AddComponent<AudioSource>();
        _AudioSource.clip = sfx;
        _AudioSource.minDistance = _MinDistance;
        _AudioSource.maxDistance = _MaxDistance;
        _AudioSource.volume = sfxVolume;
 
        _AudioSource.Play();
 
        Destroy(SoundPlayObject, sfx.length);
    }
    public void PlaySfx(AudioClip sfx)
    {
        PlaySfx(sfx,SoundPlayPosition, DefaultMinDistance, DefaultMaxDistance, sfxVolume);
    }
    public void PlaySfx(AudioClip sfx, float _MinDistance, float _MaxDistance)
    {
        PlaySfx(sfx,SoundPlayPosition, _MinDistance, _MaxDistance, sfxVolume);
    }
    public void PlaySfx(AudioClip sfx, Vector3 _pos)
    {
        PlaySfx(sfx, _pos, DefaultMinDistance, DefaultMaxDistance, sfxVolume);
    }
    public void PlaySfx(AudioClip sfx, Vector3 _pos, float _MinDistance, float _MaxDistance)
    {
        PlaySfx(sfx, _pos, _MinDistance, _MaxDistance, sfxVolume);
    }
    public void PlaySfx(AudioClip sfx, Vector3 _pos, float sfxVolume)
    {
        PlaySfx(sfx, _pos, DefaultMinDistance, DefaultMaxDistance, sfxVolume);
    }
}
cs


Posted by 시리시안
2016. 2. 22. 05:53

첨부 파일에 패키지 드립니다.

제가 만든게 아니고, 외국 사이트에서 받은건데..

출처를 알게되면 바로 수정하겠습니다.


spine-unity.unitypackage



Posted by 시리시안
2016. 2. 22. 05:51



저번글에 이어서 봅시다.
이번 글에서는 스파인 좌측 기능에 대해서 볼껍니다.
SkeletonAnimation를 보면 여러 기능을 가지고있네요.
차례대로
스킨, 레이어,어드밴스안에 메시기능과
Z축 거리 노말 연산, 등..
그리고 애니메이션과 루프 타임스케일이 있네요.

위에서부터 봅시다.

스킨은 말그대로 스파인 디자이너가 넣어준 스킨을 교체합니다.
레이어는.. 굳이 설명 안해도 될꺼같네요

어드밴스 부분을 봅시다.
서브매시를 다루는 부분과
Z Spacing이 있네요

먼저 서브메시를 다루는건.. 음.. 내용이 좀 길어 질테니
로 대신합니다.

영상을 그대로 보시고 따라하시면 손쉽게 익히실수 있습니다.

그다음 Z Spacing을 봅시다.
3D뷰로 바꾸고 숫자를 조절하면 바로 알수있을꺼애요




이처럼 2D공간내에서 벌어지게 됩니다.
사용법은.. 서브메시를 이용할때 사용하셔도되고,
일부만 들어가는 파티클 작업이나, 라이트 작업에 사용하셔도됩니다.

그외 노말 과 탄젠트 계산법은 생략할게요.

애니메이션 네임과 루프와 타임스케일은 전부 아실꺼라 생각합니다~


Posted by 시리시안