LambFerret's Blog

#6 <스크립트 만들기 - 4 몬스터 AI> 본문

게임 개발/#1 너구리 (2D 플랫포머)

#6 <스크립트 만들기 - 4 몬스터 AI>

램페럿 2021. 7. 19. 17:52

사실 게임의 대부분은 이미 다 만들었다. 게임을 잠정적으로 끝마쳤다고 생각했을때는 7월15일쯤이고, 첫 포스팅이 7월 8일인데 유니티 2일차였으니까 열흘정도 투자했다고 볼 수 있다. 당연 시간을 알차게 전부 쓴것은 아니지만 계속 만들면서 유익하게 배워나간 것 같다. 그런이유로 스포일러하자면.. 이번파트가 제일 시간이 오래 걸렸다. 

겁 나 어 렵 습 니 다


만들어야 하는 상호작용

  1. 이동
  2. 점프
  3. 사다리
  4. 피격 -> 패배
  5. 점수 -> 승리
  6. 적 이동

 

 

우선 미리 코드를 보여주겠다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyMovement : MonoBehaviour
{
    public float speed;
    Rigidbody2D rb;
    RaycastHit2D rayHit;
    Ray2D ray;


    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        ray = new Ray2D();
    }


    void Update()
    {
        rb.velocity = new Vector2(speed, rb.velocity.y);
    }


    void FixedUpdate()
    {
        float distance = 4.42f;
        if (speed > 0)
        {
            ray.direction = new Vector3(1, -1, 0);
            rayHit = Physics2D.Raycast(rb.position, ray.direction, distance, ~3);
        }
        else
        {
            ray.direction = new Vector3(-1, -1, 0);
            rayHit = Physics2D.Raycast(rb.position, ray.direction , distance, ~3);

        }
        if (!rayHit)
        {
            speed = -speed;
        }
    }
}

 

 

 

우선은

 

하고싶은 것 :

 게임 시작과 동시에 단순하게 x축으로 이동한다. 바닥이 끝날때쯤엔 반대쪽 방향으로 똑같이 이동한다. 이를 게임끝날때 까지 반복한다. 

방법 : 

  유니티에 주어진 Ray를 사용한다. ray는 말그대로 광선으로 이 광선이 물체에 닿는지 아닌지를 판단할 수 있다. 몬스터의 중심에서 발밑 앞쪽으로 ( 오른쪽을 보고있다면 5시방향 ) 광선을 발사한다. 이 광선에 platform이 닿지 않으면, speed를 역전시켜 반대방향으로 향하게 한다. 

 

는 아이디어를 구현해보겠다.

간단히 말하자면 <<발밑 만 보면서 다니다가 아무것도 없으면 뒤를 보겠다.>> 라는 것이다. 

 

원하는대로 되지 않아서 시간을 잡아먹은 부분이 한두가지가 아니였다. 

 

1. 2D게임이지만 ray는 3D로도 만들어 질 수 있었다. 

2. 광선이 보이지 않는다. 광선은 Debug.DrawRay(rb.position, ray.direction * distance, Color.red); 로 간접적으로 알아보는 수 밖에 없다. 

3. 광선이 닿았는지 아닌지를 판별하는 Physics2D.Raycast(rb.position, ray.direction, distance, ~3); 의 메소드 오버로딩때문에 파라미터의 순서가 중요하다. 

 

각각 한가지씩 해결하는게아니라 세개가 꼬여서 해결하려면 한번에 해야했기에 더 힘들었던듯 하다. 

 

1번 : 2D에서 Debug.DrawRay가 안보일때 해결법

현재는 해결했지만 전에는 광선이 Z축으로 나와서 2d에서 확인할 수가 없었다.

#Scene 밑에 2d를 눌러보면 3d로 전환이 가능하다 그리고 오른쪽 위의 Gizmos를 켜야한다. 

 

2번 : Debug.DrawRay , Physics2D.Raycast 의 관계

처음에는 DrawRay는 Raycast와 다르게 distance를 넣는 자리가 없어서 광선의 길이에서는 서로간의 관련성에 신뢰가지 못했다. 따라서 발밑까지의 distance가 얼마인지도 알 수 없었다. 이 거리를 재기 위해서 

작은 스프라이트 박스를 만든 후 이 서로간의 계산을 위해 

Vector3.Distance(transform.position, other.position)

를 사용했다. 

이 값으로 distance = 4.42f를 얻게 되었다. 

 

3번 : Raycast의 파라미터

코드에서는 Physics2D.Raycast(rb.position, ray.direction, distance, ~3); 를 사용했다 마지막의 ~3은 '무시'할 레이어를 선택한 것이다. 여기서는 바닥 플랫폼의 레이어인 3번을 제외한 전부 라는 뜻의 ~3 을 적었다. 비트 연산자는 아직 익숙하지않기에 !3 도 사용해보고 ||도 사용해보았지만 결국 그냥 바닥을 제외한 전부를 무시하기로 하였다. 

 

 

 

완성! 이번엔 별다른 고칠점이 없어보인다. 

 

너굴맨은 잠정적으로 여기서 끝냈다. 같은 방법을 응용하면 다른 레벨도 만들 수 있고 적도 만들 수 있다. 기본적인 유니티의 움직임과 사용법을 알기 위해서 시작했지만 생각보다 더욱 충실하게 익힐 수 있는 시간이었다. 역시 실전이 좋은 선생인듯 하다. 

Comments