내가 만들려는 게임에서는 유령 몹이 플레이어를 따라와야 하고, 플레이어를 계속 바라봐야 한다.
Unity에서는 transform.Lerp와 LookAt으로 이미 만들어져 있는 함수로 쉽게 구현이 가능하지만, RedBrick에서는 없기 때문에 만들어보자.
몹을 따라오는 함수를 사용하려면 일단 몹을 불러와야 한다.
몬스터는 여러 마리 존재하기 때문에 배열로 호출하여 불러왔다.
따라갈 플레이어도 불러와준다.
const player = getObject("player") // Player Object
const ghosts = getObjectsByName("ghost") // Monster Ghost Objects
getObject(string)
는 Title 기준으로 하나의 객체만 불러오고,
getObjectsByName(string)
은 Title 기준으로 동일한 친구들을 모두 불러온다.
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축을 이동하여 부자연스러운 느낌이 발생했다.
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)
}
사용이 쉽도록 함수로 묶어줬고, 속도에 플레이어까지 길이 비율을 곱했다.
길이가 짧으면 천천히가고, 길면 더 빨리 가도록 코드를 수정하여 해결하였다.
몹 따라오기 완성!