더보기
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를 통해 절대 값으로 고정

 

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

 

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

 

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

 

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

+ Recent posts