유니티 게임오브젝트에 애니메이션을 적용하기 위해서는 컴포넌트로  Animation을 추가해주면 된다.


[컴포넌트를 추가하는 방법]


1. 컴포넌트를 붙이길 원하는 게임오브젝트를 선택한다.


2. Add Component를 누른뒤 Animation을 추가한다.


3. Animation 컴포넌트가 추가되었다. 물론, 아무것도 넣지 않았기때문에 None 즉 아무 애니메이션도 존재하지 않는다.


4. death라는 애니메이션을 Animation에다가 집어넣었다. 이 경우 애니메이션 동작을 한 개(death)만 보여줄 경우이다.


5. 한 게임오브젝트에 여러 애니메이션을 재생하려면, Animations에다가 여러개의 애니메이션 파일을 집어넣는다.



그렇다면 Animations에 담긴 애니메이션 파일은 어떻게 사용할까?


일단, 코드에서 애니메이션을 실행하는 코드는 anim.Play("");이다.


그럼, Animations는 배열이므로 string[]배열을 사용해야 할 것이다.


하지만 배열은 선언할 때 반드시 크기를 명시해줘야 한다.


즉, 배열에 저장할 데이터의 크기를 확실히 모르거나 데이터가 도중에 추가될 가능성이 있다면 배열을 사용하면 안 된다.


List를 사용한다.

 


    List<string> animArray;
    Animation anim;     
int index = 0;

void Start()
{
        anim = gameObject.GetComponent<Animation>();
        animArray = new List<string>();
            AnimationArray();

            anim.Play(animArray[randomNum]);
            anim.wrapMode = WrapMode.Once;
}

public void AnimationArray()
{
        foreach (AnimationState state in anim)
{
            animArray.Add(state.name);          
           index++;
}
        randomNum = Random.Range(0,index);
}



이렇게하면 된다.



중요한 함수는 AnimationArray()함수이다.


여기서, foreach문을 사용하여 AnimationState형으로 꺼내온 뒤, list에 저장한다(Add)


나는 항목들 중 랜덤으로 1회 플레이하기 위해서 Random.Range를 사용했고,


Play안에 난수를 집어넣었다. 이렇게 함으로써 랜덤한 애니메이션이 1회 플레이 될 것이다.



이상으로 애니메이션(Animation) 컴포넌트 안에 Animations 배열을 가져오는 방법에 대해 알아보았다.



Posted by sungho88
,

루프(loop)를 설정하여 무한 반복할 것인지, 한 번만 실행할 것인지(once)를 설정해야 할 때가 있다.


물론 유니티 내에서 설정이 가능하지만, 코드로 동적으로 변경하고 싶다면 어떻게 할까.


순간 Audio Source와 헷갈려서 , anim.loop = true로 작성했는데 안된다.


정신차리고...


애니메이션 loop나 once는 어떻게 설정할까?



위와같이 death 애니메이션 파일을 클릭하면, 아래와 같이 나온다.


Wrap Mode라고 씌여있다.


왠지 이것을 스크립트에서 사용하면 될 것 같아서 wrapmode를 입력해봤다.


역시. 


anim.wrapMode가 존재했다. 이것 키워드로 구글에 검색을 해보니 정답을 얻을 수 있었다.


아래와 같이 하면, 애니메이션을 제어할 수 있다.


anim.wrapMode = WrapMode.Once;


이렇게 작성하면 한번(once) 실행되고 중지된다.


anim.wrapMode = WrapMode.Loop;


이렇게 작성하면 무한 반복된다.


이상으로 유니티에서 애니메이션 반복 여부를 설정하는 코드에 대해 알아봤다.


Posted by sungho88
,

유니티 개발할 때, 사운드 두 개를 이어서 나오게 하고 싶다면 어떻게 할까?


일단, 사운드를 위해서는 AudioSource와 AudioClip 두 개가 필요하다.


public AudioClip[] intro_music;
AudioSource soundSource;


오디오 클립은 각각의 사운드 파일을 의미하며, AudioSource를 통해 플레이 한다고 할 수 있다.


사운드를 넣기 위해 public으로 선언했다. AudioSource는 GetComponent로 호출할 수 있으므로 안 해도 된다.


    void Start () {
        soundSource = GetComponent<AudioSource>();
        StartCoroutine("Playlist");
    }


이것처럼, 해당 오브젝트에서 AudioSource를 선언한 뒤, 코루틴을 호출한다.


   
 IEnumerator Playlist() {
        soundSource.clip = intro_music[0];
        soundSource.Play();
        while (true)
        {
            yield return new WaitForSeconds(1.0f);
            if(!soundSource.isPlaying) {
                soundSource.clip = intro_music[1];
                soundSource.Play();
                soundSource.loop = true;
            }
        }
    }


먼저, 


배열 0번째를 실행한다. 


실행 방법은 AudioSource의 객체 audioSource를 이용한다. 그래서 AudioSource가 필요한 것이다.


audioSource.clip을 통해 어떤 사운드 데이터를 사용할 것인지 설정한다(배열 첫 번째)

audioSource.Play();를 통해 먼저 사운드를 재상한다. 따라서, 0번째 사운드가 실행된다.


그 다음 while문이 실행된다. true이므로 무한 반복.


yield를 통해 1.0초 대기 후 아래 코드를 수행한다.


만약 사운드가 진행이 되지 않는다면, -> isPlaying


 audioSource.isPlaying의 경우 bool형이다. 실행되고 있다면 True, 재생되고 있지 않다면 False


!가 붙었으므로 멈췄으면 if를 실행하라는 의미가 된다.


즉, 1초마다 체크 후 0번째 사운드가 종료되었으면 if문을 실행하라는 의미이다.


다시 audioSource.clip을 통해 1번째 사운드를 플레이한다.


audioSource.Play()을 통해 사운드를 재생한다.


audioSource.loop를 통해 반복 재생을 할 지 설정한다. true면 반복, false면 반복하지 않는다는 뜻이다.


이렇게 하게 되면


0번째 사운드는 1회 실행되고 1번째 사운드는 루프가 체크되어 무한반복된다.


이상으로 사운드를 이용하여 연속적으로 재생하는 방법을 알아보았다.


여러개의 사운드를 재생하는 것도 동일할 것이다. for문으로 i번 순서대로 돌릴 수도 있고,


랜덤으로 재생하고 싶다면 [i] 대신 Random.Range(0,xx)으로 하면 될 것이다.
















Posted by sungho88
,