inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

밑바닥부터 시작하는 왕초보 유니티 2D 게임제작

에너미 이동1

섹션2: 에너미이동

232

박미라

작성한 질문수 7

0

랜덤하게 에너미이동을 진행할 때, speed를 높이면 씬뷰에서 카메라 범위를 벗어나게 되어서 기존 코드에 다음 코드를 추가하였습니다. 그런데도 씬뷰를 벗어나게 되더라고요.

 

업데이트 부분에서 현재 위치의 x,y가 주어진 범위를 벗어나면 코루트를 시작하는 함수를 호출하여 다시 목표 방향을 설정한건데 왜 벗어나는 걸까요?

if(transform.position.x < (-hs.x)){
            StartCoroutine(ChangeDir(3f));
        }

        if(transform.position.x > (hs.x)){
            StartCoroutine(ChangeDir(3f));
        }

        if(transform.position.y < (-hs.y)){
            StartCoroutine(ChangeDir(3f));
        }

        if(transform.position.y > (hs.y)){
            StartCoroutine(ChangeDir(3f));
        }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyMove1 : MonoBehaviour
{
    public float speed = 3;

    Vector2 hs;  //half screen: 원점 초기화
    Vector2 dir; //direction: 원점 초기화

    // Start is called before the first frame update
    void Start()
    {
        hs.x = Camera.main.orthographicSize; //카메라 위쪽에서 아래쪽 바라보는 가로의  길이
        hs.y = Camera.main.aspect * hs.x;    //가로세로 비율 * 가로 길이 = 세로 길이

        StartCoroutine(ChangeDir(3f));
    }

    // Update is called once per frame
    void Update()
    {
        Vector2 delta = dir * speed * Time.deltaTime;
        transform.Translate(delta); //자동으로 z가 0으로 됨.

        if(transform.position.x < (-hs.x)){
            StartCoroutine(ChangeDir(3f));
        }

        if(transform.position.x > (hs.x)){
            StartCoroutine(ChangeDir(3f));
        }

        if(transform.position.y < (-hs.y)){
            StartCoroutine(ChangeDir(3f));
        }

        if(transform.position.y > (hs.x)){
            StartCoroutine(ChangeDir(3f));
        }
    }

    IEnumerator ChangeDir(float delta){
        
        Vector2 goal;

        while(true){
            goal.x = Random.Range(-hs.x,hs.x); //전체 가로 길이
            goal.y = Random.Range(-hs.y,hs.y); //전체 세로 길이

            dir = goal - (Vector2) transform.position;   //이동방향 = 목표지점 - 현재위치(Vector3)
            dir.Normalize();

            float delay = Random.Range(1f,delta);
            yield return new WaitForSeconds(delta);
        }
    }
}

C# unity

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

주어진 코드를 보면, 현재 위치의 x, y 좌표가 주어진 범위를 벗어날 경우에 코루틴 함수를 호출하여 다시 목표 방향을 설정하도록 작성되어 있습니다.

그런데 코드에서는 x 좌표와 y 좌표의 범위를 각각 따로 처리하고 있기 때문에, x 좌표와 y 좌표가 동시에 벗어날 경우에는 해당 조건문이 동작하지 않아서 씬뷰를 벗어나는 현상이 발생할 수 있습니다.

따라서, 위치의 x, y 좌표가 주어진 범위를 모두 벗어날 경우에 목표 방향을 설정하도록 수정하면 될 것 같습니다. 아래는 수정된 코드의 예시입니다.

if(transform.position.x < (-hs.x) || transform.position.x > (hs.x) ||
   transform.position.y < (-hs.y) || transform.position.y > (hs.y)){
    StartCoroutine(ChangeDir(3f));
}

수정된 코드에서는 x 좌표와 y 좌표를 모두 확인하여, 한 좌표라도 주어진 범위를 벗어날 경우에 목표 방향을 설정하도록 되어 있습니다. 이렇게 수정하면 씬뷰를 벗어나는 현상이 발생하지 않을 것입니다.

더 필요한 도움이 있다면 언제든지 물어보세요. 좋은 결과 얻으시길 바라요.

수박게임 자료 받았는데 plante05, 06이 없습니다.

0

15

1

14강 녹음이 안되어 있습니다

0

38

1

유니티webgl 과 안티그래비티를 협업시키고 싶습니다.

0

40

2

소스를 받을 수 있는 링크가 있을까요?

0

69

2

프로덕션 부분 사용 불가

0

70

2

접근지정자

0

71

2

섹터2 5강 Authconfig 문의

0

64

1

in-app purchasing 버튼의 install 버튼이 비활성화되어있을때 어떻게 해결해야하나요 ?

0

52

2

유니티 제외 설치한 프로그램들 및 파일 삭제 방법

0

58

1

깃허브에서 콤피유아이 매니저 설치하는게 안됩니다.

0

82

2

5강, 오류 수정과 관련해서

0

67

2

컴퓨터를 껐다가 클로드 코드 다시 키는 방법 알려주세요.

0

65

1

MA-POCA 알고리즘 응용 질문

0

47

1

Pivot을 마우스로 클릭하고 드래그해도 움직이 않아서 혹시 아시는 부분이 있나 해서 문의 남깁니다.

0

55

1

클로드에 텍스트 없이 이미지만 보낼경우 에러가 생깁니다

0

90

2

클로드 코드 API 요금관련 질문

0

105

1

이수증 관려 문의 드립니다.

0

119

1

섹션2: 충돌처리

0

247

1

low resolution aspect ratios 체크박스 비활성화

0

641

1

섹션2: 충돌처리

0

213

1

섹션2: 에너미공격

0

316

1

섹션2: 에너미 이동2

0

389

2

섹션2: 서브루틴

0

398

1

섹션1 유니티기초: 사용자 오브젝트 제어2

0

360

2