https://wlsdn629.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-Audio-Mixer-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95

 

유니티 Audio Mixer 사용방법

Audio Mixer란?오디오 소스에 대한 제어, 균형 및 동적 조정을 제공하여 리소스 사용을 최적화하여 게임을 즐기는 유저의 오디오 경험을 향상시킬 수 있습니다.Audio Mixer를 사용해야 하는 이유오디

wlsdn629.tistory.com

오디오 제어를 위한 오디오 믹서

 

더보기
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using Random = UnityEngine.Random;

public class CharacterMovement : MonoBehaviour
{
    [SerializeField] private Transform targetPointA;
    [SerializeField] private Transform targetPointB;

    [SerializeField] private GameObject speechBubble;
    
    [SerializeField] private float speed = 75f;
    [SerializeField] private float idleTime = 2f;
    
    private bool isMovingRight = true;
    private Animator animator;
    public TextMeshProUGUI speechText;
    private readonly string[] messages = { "안녕하세요!", "반가워요", "여기 어때요?" };

    private readonly int idleHash = Animator.StringToHash("Idle");
    private readonly int walkHash = Animator.StringToHash("Walk");

    private void Awake()
    {
        animator = GetComponent<Animator>();
        animator.SetTrigger(walkHash);
        speechBubble.SetActive(false);
    }

    void Update()
    {
        if(speed > 0) CharacterMove();
    }
    
    void CharacterMove()
    {
        if (speed <= 0) return;
        if (isMovingRight) //오른쪽 이동중일경우
        {
            // 우측 이동
            transform.position = Vector3.MoveTowards(transform.position, targetPointB.position, speed * Time.deltaTime);
            
            if (transform.position.x >= targetPointB.position.x)
            {
                isMovingRight = false;
                
                StartCoroutine(CharacterIdle());
            }
        }
        else // 왼쪽이동일경우
        {
            transform.position = Vector3.MoveTowards(transform.position, targetPointA.position, speed * Time.deltaTime);
            
            if (transform.position.x <= targetPointA.position.x)
            {
                isMovingRight = true;
                StartCoroutine(CharacterIdle()); // 이동 멈춤
            }
        }
        transform.localScale = isMovingRight ? new Vector3(1, 1, 1) : new Vector3(-1, 1, 1); // 오른쪽, 왼쪽방향
        // text 참조해서 flip 고정 MATHF.ABS
        //speechText.transform.localScale = isMovingRight ? new Vector3(1, 1, 1) : new Vector3(-1, 1, 1);

        Vector3 speechTextscale = speechText.transform.localScale;
        speechTextscale.x = Mathf.Abs(speechTextscale.x) * (isMovingRight ? 1 : -1);
        speechText.transform.localScale = speechTextscale;
    }
    
  
    
    IEnumerator CharacterIdle()
    {
        speed = 0;
        animator.SetTrigger(idleHash);
        string randomMessage = messages[Random.Range(0, messages.Length)];
        speechText.text = randomMessage;
        speechBubble.SetActive(true);
        
        yield return new WaitForSeconds(idleTime);
        
        speechBubble.SetActive(false);
        speed = 75f;
        animator.SetTrigger(walkHash);
    }
}

 

 

transform.position = Vector3.MoveTowards(transform.position, targetPointB.position, speed * Time.deltaTime);

 

MoveTowards를 통해서 Target A, B사이를 왔다갔다 하면서 말을 하는 캐릭터 컨셉.

 

Vector3 speechTextscale = speechText.transform.localScale;
speechTextscale.x = Mathf.Abs(speechTextscale.x) * (isMovingRight ? 1 : -1);
speechText.transform.localScale = speechTextscale;

 

캐릭터 위치 전환에 따라 flip 값이 바뀌므로 Mathf.abs를 통해 절대값으로 고정

 

rivate readonly string[] messages = { "안녕하세요!", "반가워요", "여기 어때요?" };

 

string 배열을 통해 대화메시지를 설정하고

 

string randomMessage = messages[Random.Range(0, messages.Length)];

 

0부터 메시지 배열 길이만큼 랜덤으로 설정된 메시지 호출 

+ Recent posts