RedBrick - 몹 따라오기

Checking·2023년 3월 25일
0

RedBrick

목록 보기
2/3
post-thumbnail

내가 만들려는 게임에서는 유령 몹이 플레이어를 따라와야 하고, 플레이어를 계속 바라봐야 한다.

Unity에서는 transform.Lerp와 LookAt으로 이미 만들어져 있는 함수로 쉽게 구현이 가능하지만, RedBrick에서는 없기 때문에 만들어보자.

몹 따라오기

기초 몹 호출

몹을 따라오는 함수를 사용하려면 일단 몹을 불러와야 한다.

몬스터는 여러 마리 존재하기 때문에 배열로 호출하여 불러왔다.
따라갈 플레이어도 불러와준다.

const player = getObject("player")          // Player Object
const ghosts = getObjectsByName("ghost")    // Monster Ghost Objects

getObject(string)는 Title 기준으로 하나의 객체만 불러오고,
getObjectsByName(string)은 Title 기준으로 동일한 친구들을 모두 불러온다.

코드 Ver 1.0

const speed = 10.0;

setInterval(() => 
{
    for (var i=0; i<ghosts.length; i++)
    {
        ghosts[i].moveX(player.getPosition().x - ghosts[i].getPosition().x, speed)
        ghosts[i].moveY(player.getPosition().y - ghosts[i].getPosition().y + 1, speed)
        ghosts[i].moveZ(player.getPosition().z - ghosts[i].getPosition().z, speed)
    }
})

움직이는 함수는 moveX(dx, speed), moveY(dy, speed), moveZ(dz, speed)를 사용하였다.
자신 위치를 기준으로 얼만큼(dx, dy, dz)을 몇의 속도(speed)로 움직인다.

goTo는 한번에 그 위치로 이동하는 함수여서 따로 또 Lerp값을 구해줘야해서 자신 기준으로 움직이는 함수를 사용하였다.

자신의 위치를 기준으로 플레이어의 방향으로 크기만큼 시간에 걸쳐 이동하게 된다.

문제점

이러면 몹들이 잘 따라오긴 하는데 문제점이 하나 생겼다.
x, y, z 모두 동일한 속도로 이동하면 (a)와 같이 x 거리와 y 거리가 같다면 문제가 없지만
(b)와 같이 거리가 다르다면 x축을 먼저 모두 이동해버리고, y축을 이동하여 부자연스러운 느낌이 발생했다.

코드 Ver 2.0

function monsterFollow(monster)
{
  let _disX = player.getPosition().x - monster.getPosition().x
  let _disY = player.getPosition().y - monster.getPosition().y
  let _disZ = player.getPosition().z - monster.getPosition().z

  let _dis = abs(sqrt(_disX * _disX + _disY * _disY + _disZ * _disZ))

  monster.moveX(_disX     , abs(_disX) / _dis * monsterMoveSpeed)
  monster.moveY(_disY + 1 , abs(_disY) / _dis * monsterMoveSpeed) // +1 해줘야 몸을 타겟으로 따라감
  monster.moveZ(_disZ     , abs(_disZ) / _dis * monsterMoveSpeed)
}

사용이 쉽도록 함수로 묶어줬고, 속도에 플레이어까지 길이 비율을 곱했다.
길이가 짧으면 천천히가고, 길면 더 빨리 가도록 코드를 수정하여 해결하였다.

결과!


몹 따라오기 완성!

profile
(ง ᐖ)ว

0개의 댓글