상세 컨텐츠

본문 제목

애니메이터 아바타 변경하기(Animator.Avatar, 캐릭터 교체)

유니티/게임만들기

by MJ_119 2024. 5. 1. 20:25

본문

using UnityEngine;

public class ChangeCharacter : MonoBehaviour
{
    public Avatar avatar1; // 첫 번째 아바타
    public Avatar avatar2; // 두 번째 아바타

    private Animator animator; // Animator 컴포넌트

    void Start()
    {
        animator = GetComponent<Animator>(); // 시작 시 Animator 컴포넌트를 가져옴
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.C)) // C 키를 누르면
        {
            ChangeAvatar(); // 아바타 변경 함수 호출
        }
    }

    void ChangeAvatar()
    {
        GameObject heroObj = transform.Find("Hero").gameObject;
        GameObject girlObj = transform.Find("Girl").gameObject;

        if (animator.avatar == avatar1) // 현재 아바타가 첫 번째 아바타이면
        {
            animator.avatar = avatar2; // 두 번째 아바타로 변경
            heroObj.SetActive(false);
            girlObj.SetActive(true);
        }
        else // 그렇지 않으면
        {
            animator.avatar = avatar1; // 첫 번째 아바타로 변경
            heroObj.SetActive(true);
            girlObj.SetActive(false);
        }
    }
}

 

간단하게 플레이 도중에 C키를 누르면 다른 캐릭터로 변하는것을 구현해봄.

 

변경할 프리팹과 아바타들을 미리 넣어놓고 활성화 & 비활성화 하면서 동시에 아바타도 변경해 주기.

 

위 방식은 StarterAssets / ThirdPersonController를 사용해서 구현함.

 

 

 

 @ 캐릭터 변경할때 이펙트 나오게 하기

 

using UnityEngine;

public class ChangeCharacter : MonoBehaviour
{
    public Avatar avatar1; // 첫 번째 아바타
    public Avatar avatar2; // 두 번째 아바타

    private Animator animator; // Animator 컴포넌트

    public GameObject respawnEffectPrefab1; // 이펙트 프리팹1
    public GameObject respawnEffectPrefab2; // 이펙트 프리팹2


    void Start()
    {
        animator = GetComponent<Animator>(); // 시작 시 Animator 컴포넌트를 가져옴
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.C)) // C 키를 누르면
        {
            CreateRespawnEffect(); // 이펙트 생성

            ChangeAvatar(); // 아바타 변경 함수 호출
        }
    }

    void ChangeAvatar()
    {
        GameObject heroObj = transform.Find("Hero").gameObject;
        GameObject girlObj = transform.Find("Girl").gameObject;

        if (animator.avatar == avatar1) // 현재 아바타가 첫 번째 아바타이면
        {
            animator.avatar = avatar2; // 두 번째 아바타로 변경
            heroObj.SetActive(false);
            girlObj.SetActive(true);
        }
        else // 그렇지 않으면
        {
            animator.avatar = avatar1; // 첫 번째 아바타로 변경
            heroObj.SetActive(true);
            girlObj.SetActive(false);
        }
    }

    void CreateRespawnEffect()
    {
        if (animator.avatar == avatar1)
        {
            // 이펙트 프리팹을 현재 캐릭터의 위치에 생성
            GameObject effect1 = Instantiate(respawnEffectPrefab1, transform.position, transform.rotation);

            Destroy(effect1, 4f);
        }
        else
        {
            // 이펙트 프리팹을 현재 캐릭터의 위치에 생성
            GameObject effect2 = Instantiate(respawnEffectPrefab2, transform.position, transform.rotation);

            Destroy(effect2, 4f);
        }
    }
}

 

 

 

프리팹만 추가해서 원하는 이펙트 VFX 프리팹 넣고 코드 수정. 이펙트가 시간이 지나도 하이어라키에 남아 있는걸 막기위해 N초 뒤에 삭제시킴.

관련글 더보기