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

만들어야 하는 상호작용
이동점프사다리피격 -> 패배점수 -> 승리- 적 이동
우선 미리 코드를 보여주겠다.
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가 안보일때 해결법

#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 도 사용해보고 ||도 사용해보았지만 결국 그냥 바닥을 제외한 전부를 무시하기로 하였다.

완성! 이번엔 별다른 고칠점이 없어보인다.
너굴맨은 잠정적으로 여기서 끝냈다. 같은 방법을 응용하면 다른 레벨도 만들 수 있고 적도 만들 수 있다. 기본적인 유니티의 움직임과 사용법을 알기 위해서 시작했지만 생각보다 더욱 충실하게 익힐 수 있는 시간이었다. 역시 실전이 좋은 선생인듯 하다.
'게임 개발 > #1 너구리 (2D 플랫포머)' 카테고리의 다른 글
#5 <스크립트 만들기 - 3 레벨 디자인> (0) | 2021.07.18 |
---|---|
#4 <스크립트 만들기 - 2 사다리> (0) | 2021.07.18 |
#3 <스크립트 만들기 - 1 이동, 점프> (0) | 2021.07.14 |
#2 <애니메이션 만들기> (0) | 2021.07.12 |
#1 <2D 플랫포머 맵 제작> (0) | 2021.07.08 |