[개발일지] 16. ClayMove 스크립트 수정

2025. 1. 17. 20:59·유니티 프로젝트/점토게임

0. 들어가기 전에

이제 보니까 비활성화 된 점토가 다시 활성화 될 때 ClayMove 스크립트가 제대로 동작하지 않는 모습을 확인했다. ClayMove 스크립트를 수정해서 정상적으로 작동하도록 했다.

 

 


 

 

1. 스크립트

ClayMove 스크립트를 수정했다.

 

1.1 ClayMove 스크립트

using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public enum MoveDirection
{
    Minus = -1, Plus = 1, Idle = 0 
}

public class ClayMove : MonoBehaviour
{
    [Header("ClayMovement")]
    public float moveSpeed; // 움직이는 속도

    public MoveDirection moveDirX; // x 축 방향
    public MoveDirection moveDirY; // y 축 방향

    public bool isMoving; // 돌아다니는지 여부 확인
    public bool isReturning; // 중점으로 돌아가는 중인지 여부 확인

    public GameObject targetPosObj; // 중점에 있는 게임 오브젝트 할당해주기

    private Coroutine randomMoveCoroutine;

    [Header("Animation")]
    public Animator anim;


    void Start()
    {
        // 코루틴의 핸들을 저장하고 이를 통해 중단하는 것이 좋음
        randomMoveCoroutine = StartCoroutine(RandomMove());

        anim = GetComponent<Animator>();

        targetPosObj = GameObject.Find("TargetObj"); // 게임 오브젝트 찾아서 할당하기
    }

    private void OnEnable()
    {
        // 코루틴 중복 호출 막기
        if (randomMoveCoroutine != null)
        {
            StopCoroutine(randomMoveCoroutine);
        }
        randomMoveCoroutine = StartCoroutine(RandomMove());
        isReturning = false; // 활성화 시 반환 상태 초기화

        // 애니메이션도 초기황..
        if (anim != null)
        {
            anim.SetBool("isWalk", false);
        }
    }

    void Update()
    {
        if (!isReturning)
        {
            // Time.deltaTime 을 곱해주는 이유는 게임 오브젝트가 순간이동 하는 것을 막기 위함.
            transform.Translate(moveSpeed * Time.deltaTime * new Vector2((int)moveDirX, (int)moveDirY));

            // x 축 이동 방향이 오른쪽이면 sprite 를 뒤집도록..
            if (moveDirX == MoveDirection.Plus)
                gameObject.GetComponent<SpriteRenderer>().flipX = true;
            else if (moveDirX == MoveDirection.Minus)
                gameObject.GetComponent<SpriteRenderer>().flipX = false;
        }

        // Idle 상태가 아니라면 walk 애니메이션 수행하도록
        if (moveDirX != 0 || moveDirY != 0)
        {
            anim.SetBool("isWalk", true);
        }
        else
        {
            anim.SetBool("isWalk", false);
        }
    }

    // 점토가 비활성화 될 때..
    private void OnDisable()
    {
        // 코루틴 종료
        if (randomMoveCoroutine != null)
        {
            StopCoroutine(randomMoveCoroutine);
        }
    }

    // 3초에 한 번씩 이동 방향 바꾸도록 하는 코루틴..
    // 코루틴은 IEnumerator 를 반환함
    private IEnumerator RandomMove()
    {
        while (true)
        {
            // 방향 랜덤으로 설정
            moveDirX = (MoveDirection)Random.Range(-1, 2);
            moveDirY = (MoveDirection)Random.Range(-1, 2);

            yield return new WaitForSeconds(3f); // 3초 동안 기다령 
        }
    }

    private IEnumerator ReturnToCenter()
    {
        isReturning = true;

        float curTime = 0f;
        float duration = 5f; // 중점으로 돌아가는 시간 5초 만큼 줄 것..

        Vector2 targetPos = targetPosObj.transform.position; // 중점에 있는 오브젝트의 위치 할당

        while (curTime < duration)
        {
            // 현재 점토의 위치가 목표 지점보다 왼쪽에 있으면 오른쪽을 보도록..
            if (targetPos.x > transform.position.x)
                gameObject.GetComponent<SpriteRenderer>().flipX = true;
            else if (targetPos.x < transform.position.x)
                gameObject.GetComponent<SpriteRenderer>().flipX = false;

            transform.position = Vector2.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime * 1.5f);
            curTime += Time.deltaTime;

            yield return null; // 다음 프레임까지 대기
        }

        isReturning = false; // 랜덤 이동 재개
        randomMoveCoroutine = StartCoroutine(RandomMove()); // 다시 시작시키기
    }


    // 콜라이더 컴포넌트를 가진 게임 오브젝트랑 부딪히면 이 함수로 진입
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (isReturning) return; // 만약 이미 돌아가고 있는 중에 또 부딪히면 걍 나가라..

        // 부딪힌 게임 오브젝트의 태그가 Target 이면 ReturnToCenter 코루틴 호출하도록
        if (collision.gameObject.CompareTag("Wall"))
        {
            // 랜덤 이동 코루틴은 중단시키기
            StopCoroutine(randomMoveCoroutine);

            // 중앙 복귀 코루틴 호출
            StartCoroutine(ReturnToCenter());
        }
    }
}

 

 

1.2 ClayMove 스크립트 변경 사항 설명

더보기

1. OnEnable()

메서드를 새로 추가했다. 이는 게임 오브젝트가 활성화 될 때 자동으로 호출되는 메서드이다.

 

점토가 다시 활성화 되었을 때 코루틴을 중복으로 호출하는 것을 막기 위해서 이미 돌아가고 있는 코루틴이 있다면 종료시켰다. 그 후 새로운 코루틴을 시작하고 randomMoveCoroutine 변수에 할당했다.

 

그리고 isReturing 의 값이 true 로 설정되어 있으면 점토의 움직임이 제대로 작동하지 않을 가능성이 있기 때문에 이 값도 false 로 초기화 해줬다.

private void OnEnable()
{
    // 코루틴 중복 호출 막기
    if (randomMoveCoroutine != null)
    {
        StopCoroutine(randomMoveCoroutine);
    }
    randomMoveCoroutine = StartCoroutine(RandomMove());
    isReturning = false; // 활성화 시 반환 상태 초기화

    // 애니메이션도 초기황..
    if (anim != null)
    {
        anim.SetBool("isWalk", false);
    }
}

 

 

 2. OnDisable()

새로 추가한 메서드이다. 게임 오브젝트가 비활성화될 때 자동으로 호출되는 메서드이다.

 

돌아가는 중인 코루틴을 강제적으로 종료시켰다.

// 점토가 비활성화 될 때..
private void OnDisable()
{
    // 코루틴 종료
    if (randomMoveCoroutine != null)
    {
        StopCoroutine(randomMoveCoroutine);
    }
}

 

 


 

 

2. 결과물

 

 

 

 

 

 

'유니티 프로젝트/점토게임' 카테고리의 다른 글
  • [개발일지] 18. 레벨에 맞게 장난감 소환 & 데이터 적용
  • [개발일지] 17. 가구 추가 & 애니메이션 적용
  • [개발일지] 15. 이펙트 효과 적용
  • [개발일지] 14. 업그레이드 판넬 제작&기능 구현&데이터 저장
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (343)
      • 프로그래밍언어론 정리 (5)
      • 컴퓨터네트워크 정리 (5)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 백준 문제 (196)
        • 이분탐색 (7)
        • 투포인트 (10)
        • 그래프 (7)
        • 그리디 (24)
        • DP (25)
        • BFS (18)
        • MST (7)
        • KMP (4)
        • Dijkstra (3)
        • Disjoints Set (4)
        • Bellman-Ford (2)
        • 시뮬레이션 (3)
        • 백트래킹 (15)
        • 위상정렬 (5)
        • 자료구조 (25)
        • 기하학 (1)
        • 정렬 (11)
        • 구현 (8)
        • 재귀 (8)
        • 수학 (8)
      • 유니티 공부 (11)
        • 레트로의 유니티 게임 프로그래밍 에센스 (11)
        • 유니티 스터디 자료 (0)
        • C# 공부 (0)
      • 유니티 프로젝트 (48)
        • 케이크게임 (13)
        • 점토게임 (35)
      • 언리얼 공부 (10)
        • 이득우의 언리얼 프로그래밍 (10)
      • 진로 (1)
      • 논문 읽기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    해시
    자료구조
    이분탐색
    투포인터
    시뮬레이션
    골드메탈
    티스토리챌린지
    맵
    스택
    수학
    유니티 공부 정리
    이득우
    BFS
    유니티
    레트로의 유니티 프로그래밍
    재귀
    백트래킹
    정렬
    백준
    언리얼
    우선순위큐
    이벤트 트리거
    큐
    그래프
    dp
    유니티 프로젝트
    그리디
    바킹독
    오블완
    C#
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[개발일지] 16. ClayMove 스크립트 수정
상단으로

티스토리툴바