[월간TECH프로젝트] 로블록스 "빨간마스크" 게임 제작기 4주차

2021. 11. 29. 23:54
728x90
반응형

=== Prologue ===

 

 

지난 3주 차 때 스크립트를 분석을 하고, 실행해 본 결과

움직임이 완벽하지 못했다. 애니메이션에 관해 찾아보고 버벅거리다가 3주 차가 지나버렸고,

그 이후로는 감기에 걸려 컨디션이 좋지 못했다.  

 

신체력 저하와 함께

필자의 조급함이 더해져 지속력은 여기까지인가?라는 위기감도 찾아왔다.   

 

3주차 후반에서 주말까지 왔던

위기감과 무기력함을 극복하고, 새로운 결과물을 낸 스토리를 공유하고자 한다.  

 

 

==== Mission ====

 

[4주 차의 미션은 사실상 프로젝트 막바지에 다다르고 있어야 했다.]

 

 풀리지 않는 애니메이션 움직임의 문제를 파악하고 해결해야한다.

✔ 반복적으로 열거해 놓은 집과 나무들이 자연스럽지 못해, 배치를 다시 하거나 맵을 다시 꾸며야 한다. 

✔ 게임 시작할 때부터 끝날 때까지 플레이어들이 어떻게 시작하고 끝내게 될 건지에 대한 순서 및 스토리를 넣어야 한다. 

 

✔ 월간 복기를 진행해보고자 한다. 

 

=== description ===

 

 풀리지 않는 애니메이션 움직임의 문제는 개발자야잴씨 도움을 받았다. 

움직임에 성공했다!!!!
애니메이션 스크립트에 문제가 있는 줄 알았는데 삽질이었다.

또 다른 스크립트를 추가해줘야 했다. 

② 맵의 틀을 잡았다. 마을의 구색을 갖추었지만, 레드 마스크 스토리상 한국의 복잡한 마을을 표현함과 달리, 상큼한 레몬 마을이 되었다. 그렇게 전반적 스토리라인도 대부분 수정하게 되었다. 

 

③ 맵을 수정하고 배치하면서, 점프 맵 게임으로 확정을 지었고, 썸네일부터 플레이어가 들어왔을 때, 게임을 진행할 때, 끝을 어떻게 맺을지에 대한 스토리도 거의 확정을 시켰다. 

④ 배경, 조명,  사운드 등을 조정해서 좀 더 자연스럽고 현실감 있게 (레고이지만) 입체감을 부여했다. 

 

⑤ 4주 차이므로, 월간 복기도 진행해 보았다. (미완성이지만)

 

 

 

반응형

 

 

==== detail progress ====

 

①  PathfindingService  그리고 lerp() 함수에 대하여

 

 

📍 움직임이 아래와 같은 영상처럼 일어났었다. 그런데 너무 부자연스럽지 않은가?? 

빨간 마스크가 움직이지 않고 그냥 내가 가는 길에 순간 이동하는 방식으로 따라왔었다. 

 

📍  이문제가 ANIMATION에 있다고 보고, 몇 번이고 수정하고 서버 스크립트에 옮겼다가 로컬로 옮겼다가 애니메이션 스크립트를 봤다가 했는데, 그 문제가 아니었다!!! 개발자야잴씨가 가져온 스크립트를 보고 또 본 결과 

 

📍  내가 놓친 핵심은 두 가지로 구분했다. 첫 번째는 PathfindingService 함수에 있었다.

바로 두 점이 위치해 있을 때, 그 거리를 구해주는 함수이다. 

 

PathfindingService is used to find paths between two points. These paths make sure that characters can move between the points without running into walls or other obstacles. Paths can be used for both player-controlled characters and non-player characters.

 

📍 이 서비스를 이용하여, 두 사이 거리의 위치를 잡아주고, 

📍 두 번째로는  lerp() 함수. 처음 보는 개념이었는데 로블록스 내장 함수도 아니었다.(공식문서에 없었음) 

 

유니티에 나오는 개념이라고 한다.

선형 보간법

끝점의 값이 주어졌을 때 그 사이에 위치한 값을 추정하기 위해하여 직선거리에 따라 선형적으로 계산하는 법

 

어떤 수치에서 다른 수치로 값이 변경되는데 한 번에 변경되지 않고 부드럽게 변경되게 하고 싶다 할 때 사용한다고 한다. 

 

🧨 이에 관한 설명은 아래 참고 사이트를 첨부하겠다. 두 사이트만 읽어봐도 어느 정도 개념 이해하는데 충분하다고 본다!

출처 : http://developug.blogspot.com/2014/09/unity-vector-lerp.html

 

📍 두 가지 개념을 이용하여 적용시킨 움직임은 부드러웠다. 훨씬 자연스러워졌다. 

 

 

debugMode = false
targetNPCs = false

--

h = script.Parent.Parent:WaitForChild("Humanoid")
pathService = game:GetService("PathfindingService")
targetV = script.Parent:WaitForChild("Target")

function closestTargetAndPath()
	local humanoids = {}
	if targetNPCs then
		local function recurse(o)
			for _,obj in pairs(o:GetChildren()) do
				if obj:IsA("Model") then
					if obj:findFirstChild("Humanoid") and obj:findFirstChild("Torso") and obj.Humanoid ~= h and obj.Humanoid.Health > 0 and not obj:findFirstChild("ForceField") then
						table.insert(humanoids,obj.Humanoid)
					end
				end
				recurse(obj)
			end
		end
		recurse(workspace)
	else
		for _,v in pairs(game.Players:GetPlayers()) do
			if v.Character and v.Character:findFirstChild("HumanoidRootPart") and v.Character:findFirstChild("Humanoid") and v.Character.Humanoid.Health > 0 and not v:findFirstChild("ForceField") then
				table.insert(humanoids,v.Character.Humanoid)
			end
		end
	end
	local closest,path,dist
	for _,humanoid in pairs(humanoids) do
		local myPath = pathService:ComputeRawPathAsync(h.Torso.Position,humanoid.Torso.Position,500)
		if myPath.Status ~= Enum.PathStatus.FailFinishNotEmpty then
			-- Now that we have a successful path, we need to figure out how far we need to actually travel to reach this point.
			local myDist = 0
			local previous = h.Torso.Position
			for _,point in pairs(myPath:GetPointCoordinates()) do
				myDist = myDist + (point-previous).magnitude
				previous = point
			end
			if not dist or myDist < dist then -- if true, this is the closest path so far.
				closest = humanoid
				path = myPath
				dist = myDist
			end
		end
	end
	return closest,path
end

function goToPos(loc)
	h:MoveTo(loc)
	local distance = (loc-h.Torso.Position).magnitude
	local start = tick()
	while distance > 4 do
		if tick()-start > distance/h.WalkSpeed then -- Something may have gone wrong. Just break.
			break
		end
		distance = (loc-h.Torso.Position).magnitude
		wait()
	end
end

while wait() do
	local target,path = closestTargetAndPath()
	local didBreak = false
	local targetStart
	if target and h.Torso then
		targetV.Value = target
		targetStart = target.Torso.Position
		roaming = false
		local previous = h.Torso.Position
		local points = path:GetPointCoordinates()
		local s = #points > 1 and 2 or 1
		for i = s,#points do
			local point = points[i]
			if didBreak then 
				break
			end
			if target and target.Torso and target.Health > 0 then
				if (target.Torso.Position-targetStart).magnitude < 1.5 then
					local pos = previous:lerp(point,.5)
					local moveDir = ((pos - h.Torso.Position).unit * 2)
					goToPos(previous:lerp(point,.5))
					previous = point
				end
			else
				didBreak = true
				break
			end
		end
	else
		targetV.Value = nil
	end
	if not didBreak and targetStart then
		goToPos(targetStart)
	end
end

 

 

 

② 맵의 틀을 잡았다. 전반적 스토리라인도 대부분 수정하게 되었다. 


게임을 점프 맵으로 정하고, 맵을 전반적으로 수정하다 보니

스토리라인과 배경까지 수정하였다. 

 

** 레몬 자이언트 with 레드 마스크

* 점프 맵
* 레몬 공장처럼 맵을 꾸민다.
* 거대한 마을이라 레몬 자이언트라고 이름을 바꿈

* 웰컴 아이템으로 레몬 3개를 나눠준다.
* 모든 바퀴를 돌면서 레몬을 획득하며, 꿀 3개를 획득하면 성공!
* 레몬이 있으면 좀비들을 쫓아 낼 수 있다. - 다른 곳으로 가게 함(대미지 줌)
* 아래층으로 가면 죽음 * 레몬 밭으로는 좀비들이 다가오지 못한다.
* 떨어지면 좀비들이 득달같이 달려든다. (RED MASK)
* 중간에 레몬을 획득할 수 있다.


** 스토리 로직
1. 썸네일 - Welcome to Lemon World
2. 튜토리얼 소개
Hello! Please greet with Lemon guy [Lemon guy]
-> Hello. [Nick Name]. Here is Lemon Giant Village.
You can play here whenever you want.
However, you have a mission for getting a permission.
Please get three Honey bottles to tea room. but when you get honey, please be care for RED MASK!
They kill you when you contact. but if you sqeeze lemon, they don't touch you! so ENJOY!!!!

3. 웰컴 레몬 3개 나눠주기
4. 게임 스타트!!!! ENJOY LEMON GIANT!!!!

 

 

③ 맵 변화 

 

단조로운 골목이나 동떨어진 느낌을 없애고 싶어, 다시 크게 맵을 변화 시켰다. 

 

 

전반적으로 이런 거대한 점프 맵 느낌이다. 좀비의 수도 늘리고, 다양한 아이템들도 추가하였다. 

이전보다 훨씬 더 구색이 갖춰진 느낌이고, background 나 sky 도 색상 변화를 통해 최종적으로는 어둡게 가려고 한다. 

 

 

 

==== Result ====

 

🌵 3주 차 후반.. 감기가 걸려 컨디션이 많이 안 좋았고, 그와 더불어 프로젝트에 대한 조급함이 생겨났다. 

🌵 잘하고 있다는 것을 알지만 생각보다 나를 계속 채찍질하고 있었다. 

🌵 월간 테크의 전체적 방향성에 대해 명확하지 않은 의문도 함께 있었다. [목표?] 

🌵 필자의 이런 마음은 함께 프로젝트를 하는 개발자야잴씨 에게 까지 전달이 되었고, 

🌵 개발자야잴씨 이런 문제를 함께 공유하고자 먼저 안건을 꺼내어 왔다. 더불어 개발자야잴씨 스스로의 역할 분배에 대한 의문이 있었던 것 같다. 

🌵 서로 월간 테크에 대한 생각과 방향성에 대해 토론하는 시간을 가진 결과, 월간 테크를 통해 우리가 어떤것을 얻고싶고[개인적] 사람들에게 나누고자하는 메세지가 무엇인지에 대해 좁힐 수 있었다. [공적] 

🌵 개인적 성장도 중요하지만, 사람들에게 어떻게 월간테크를 포지셔닝할까? 에 대한 답도 분명 있어야 하기 때문이다. 

🌵 또한 가고자 하는 방향성은 같지만, 각자의 목표와 얻고자 하는 것은 달랐다. 현재 우리 팀은 따로 또 같이라는 개념으로 함께 월간 테크를 진행 중이다. 

 

🌵 목표나 방향성에 대한 이야기를 나누면서 다시 흐트러진 마음을 다잡게 되었고, 조금 쉬고 나니 컨디션은 회복되었다. 또 혼자 하는 프로젝트가 아니다 보니, 한 사람이 다운되거나 무력해지면 다른 한사람이 리마인드 시켜주면서 끌어주기에 다시 지속할 수 있는 힘이 생겨났다.

 

🌵 메타버스에 대한 긍정적 희망과 로블록스에 대한 발전 가능성은 날이 갈수록 커져 로블록스 프로젝트를 하길 잘했다는 확신이 생긴다.  

🌵 루아 문법도 알면 알수록 잘 만들어진 언어라는 것을 깨닫는다. 

🌵 로블록스는 11월 프로젝트 이후에도 계속해서 고도화시키고 발전시킬 것이다. 

 

 

 

==== Reference====

 

📌 로드맵 수정에 영감을 준 점프 맵 영상입니다. 

https://www.youtube.com/watch?app=desktop&v=UxpGzF9ZdUc&feature=youtu.be 

 

📌 lerp() 개념을 이해하는데 이해를 준 블로그입니다.

 

http://developug.blogspot.com/2014/09/unity-vector-lerp.html

 

유니티 Vector3.Lerp() 란 무엇인가?

유니티의 Vector3에 있는 Lerp() 함수는 API를 찾아보면 static Vector3 Lerp(Vector3 from, Vector3 to, float t); 구조로 이루어져 있으며, 두 벡터(from, to) 사이의 시간에 따른 위치를 ...

developug.blogspot.com

 

📌 lerp() 개념을 이해하는데 이해를 준 블로그입니다.

 

https://iygames.tistory.com/6

 

[Unity] 유니티 3D Vector의 선형보간 Lerp 정확한 사용법

[Unity] 유니티 3D Vector의 선형보간 Lerp  오늘은 유니티에서 굉장히 많이 이용되는 선형 보간 함수를 소개하겠습니다, 우선 선형보간이란 이런 것입니다. 선형 보간법 위키백과, 우리 모두의 백과

iygames.tistory.com

 

 

 

==== See More ====

 

 

🧐 로블록스 "빨간 마스크" 게임 제작기에 대한 개발자야잴씨의 테크 일지가 궁금하다면? 

 

🔽 개발자야잴씨 의 테크일지 4주차 

 

[월간TECH][11월 로블록스] 4주차 - 로블록스 pathfinding 분석과 관련 오브젝트

중얼대는 테크블로그

jaylee222.github.io

 

 

🧐 로블록스 "빨간 마스크" 게임 제작기가 궁금하다면? 

 

🔽 3주차에는 무슨일이?

 

[월간TECH프로젝트] 로블록스 "빨간마스크" 게임 제작기 3주차

=== Prologue === 어느덧 3주 차에 접어든 월간 테크 회사 끝나고 평일 자투리 시간과 주말 시간을 활용해 공부 중이다. 기록을 남긴다는것은 정말이지 생각보다 엄청난 선순환으로 작용한

bokartstudio.tistory.com

 

🔽 2주차에는 무슨일이?

 

[월간TECH프로젝트] 로블록스 "빨간마스크" 게임 제작기 2주차

=== Prologue === 작심 3일이라는 말이 있지만 2주 차를 넘어선 월간 TECH 스스로 칭찬하고 뿌듯하다. 사이드 프로젝트라 시간이 날까 했었는데 또 하고자 하는 마음이 있으면 시간이 나게 된다. 지난

bokartstudio.tistory.com

 

🔽 1주차에는 무슨일이?

 

 

[월간TECH프로젝트] 로블록스 "빨간마스크" 게임 제작기 1주차

=== Prologue === 첫 번째 월간 프로젝트는 "로블록스" 게임 제작으로 정했다. 최근 HOT 한 이슈인 메타버스의 대표주자이기도 했고, 앞으로 무궁무진한 발전 가능성을 보여주는 로블록스에 흥미가 갔

bokartstudio.tistory.com

 

 

 

 

 

 

728x90
반응형