* Tool 전용 애니메이션 제작

 

로블록스에서 간단히 애니메이션을 제작할 수 있는 툴을 지원한다.

 

PLUGINS > Build Rig 를 통해 Rig를 선택할 수 있고

PLUGINS > Animation Editor 를 통해 키프레임 애니메이션을 제작할 수 있다.

 

애니메이션을 제작했다면 로블록스에 올린 후 AnimationId를 받아올 수 있으며 AnimationId를 통해 제작한 애니메이션을 가져올 수 있다.

 

그리고 이를 기반으로 코드에서 애니메이션 트랙을 만들어서 해당 애니메이션을 플레이한다.

 

 

* Tool에 기능 추가하기

 

Tool에는 클릭 했을 때 발생하는 Activated라는 이벤트를 활용하여 만든 애니메이션 출력 시점과 기타 정보들을 처리하고 Tool의 특정 Part에 맞으면 피격 처리를 하기 위해 Part의 Touched 이벤트를 활용한다.

// 추가로 Tool에는 Equiped, Unequiped 이벤트도 존재하는데 추가로 탈착 시점에 기능을 구현할 수 있다.

-- AxeController

-- 로컬 변수

local tool = script.Parent
local anim1 = tool.anim1
local damage = 5
local isAttacking = false
local humanoid
local target
local anim1Track


-- 이벤트 함수 정의

local function onTouched(otherPart)
	
	if isAttacking == false then return end
	
	isAttacking = false
	target = otherPart.Parent:FindFirstChild("Humanoid")
	if target ~= nil then 
		if target.Parent == tool.Parent then return end
	else
		target = require(otherPart.Parent.ObjectModule)
		if target == nil then return end
	end
	
	target:TakeDamage(damage)
end


local function onActivated()
	
	isAttacking = true
	humanoid = tool.Parent.Humanoid
	anim1Track = humanoid:LoadAnimation(anim1)
	anim1Track:Play()
	
	anim1Track.Stopped:Connect(function() isAttacking = false end)
end


-- 이벤트 바인드

tool.Activated:Connect(onActivated)
tool.Attacker.Touched:Connect(onTouched)

마우스 클릭시 애니메이션 트랙을 로드하여 플레이하고, 이 시점에 Touched 이벤트가 발생한다면 데미지를 입힌다.

 

 

* 파괴 가능 오브젝트

 

파괴 가능 오브젝트에 있는 기능을 Tool에 존재하는 스크립트에서 사용하기 위해 임시로 ModuleScript를 사용하여 require를 통해 받아오도록 하였다. 나중에 코드와 구조를 정리해야 한다.

-- ObjectModule

local module = {}
local lifePoint = 20
local object = script.Parent

function module:TakeDamage(damage) -- boolean
	lifePoint -= damage

	print(lifePoint)
	if lifePoint <= 0 then
		object:Destroy()
	end
end

return module

 

 

* 테스트 화면

 

 

* Backpack

 

Backpack은 플레이어 인벤토리를 들고 있는 컨테이너 객체다. 모든 Backpack에 존재하는 Tool은 화면 하단 UI에서 확인할 수 있고, Tool을 선택하면 Tool을 Backpack에서 플레이어의 캐릭터로 이동한다.

 

플레이어의 캐릭터가 스폰되면 StarterPack과 StarterGear가 Backpack으로 복사된다.

 

 

* Tool

 

- 정의

 

Humanoid 객체가 장착할 수 있는 객체다. Player 객체 아래에 있는 Backpack에 저장된다. 기본적으로 Tool은 오른손으로 사용하게 되고 이름이 Handle인 Part 객체가 존재한다. 장착, 버리기 기능이 기본적으로 구현되어 있다.

 

사용자의 입력 뿐아니라 ContextActionService, UserInputService, Player:GetMouse 등을 사용할 수 있다. 이를 활용하면 Equipped 이벤트 때 ContextActionService의 BindAction을 호출하고 Unequipped 이벤트 때 UnbindAction을 호출함으로써 착용한 Tool에 대한 추가 액션을 구현할 수 있다.

 

 

- 제작 방식

 

간단히 만들어본 Tool이다 Part중에 하나는 Handle의 이름을 가져야하고 WeldConstraint로 분리되지 않도록 해줘야 한다.

 

 

- 사용 방식과 기본 Tool

 

월드에 존재하는 Tool을 획득, Tool을 Backpack에서 월드로 드롭, Backpack에 보관, 탈착 기능이 구현되어있다.

 

 

기본적으로 사용할 수 있도록 StarterPack에 넣을 수 있다. 스폰된 캐릭터는 Backpack에 해당 Tool을 가진 상태로 시작한다.

 

* 정의

 

모듈 스크립트(ModuleScript)는 한번 실행되고 같은 값을 리턴 루아 소스를 작성할 수 있는 도구다. 반복적으로 사용되는 기능에 대한 모듈을 설계할 때 사용된다.

 

동일한 함수가 여러 스크립트에서 사용될 때 일반적으로 같은 함수를 똑같이 모든 스크립트에 작성할 수 있다. 하지만 기능이 조금만 변경되어도 모든 스크립트를 확인하면서 수정해줘야 한다. 유지보수가 어렵다. 이러한 함수들은 모듈 스크립트에 저장하고 사용하는 스크립트에서 require를 통해 가져올 수 있다.   

 

 

* 동작 방식

 

- 특징

 

  • 모듈 스크립트의 리턴 값은 이를 요청한 로컬 스트립트, 스크립트와 관련하여 독립적이다.
  • 사용하는 곳이 로컬 스트립트라면 클라이언트에서 코드가 실행되고 스트립트라면 서버에서 코드가 실행된다. 
  • 최초 모듈 스크립트에서 require 호출은 모듈 스크립트가 양보하지 않는 이상(wait를 호출하지 않는 이상) 그냥 실행된다. 
  • require를 호출한 스레드는 모듈 스크립트가 리턴할 때까지 기다린다.
  • 모듈 스트립트에서 다른 모듈 스트립트들을 연쇄적으로 require 하는 경우 스레드가 끝나지 않을 수 있다.
  • require 사이클은 별로도 에러를 만들어 내지 않기 때문에 모듈 종속성을 잘 고려하여 작성해야 한다.

 

로컬 스크립트는 클라이언트 스크립트는 서버에서 실행되는 것을 볼 수 있다.

 

 

- 예시

 

 

// 모듈 스트립트

-- 모듈 스트립트에서는 무조건 하나의 값을 반환해야 한다. 
-- 한 변수에 모든 것들을 담아서 리턴한다.

local my_functions = {}

-- 테이블 형식으로 넣어서 반환
function my_functions.foo()
    print("Foo!")
end

function my_functions.bar()
    print("Bar!")
end

return my_functions

 

 

// 사용하는 스크립트

-- require 함수를 통해 받아오고 값을 리턴하기 전까지 기다리게 된다.
local my_functions = require(script.Parent.MyFunctions)

my_functions.foo()
my_functions.bar()

 

 

* 정의

 

스크립트(Script)는 루아 소스를 작성할 수 있는 도구로 서버에서 루아 코드를 실행시킨다.

 

 

* 동작 방식

 

- 새로운 스레드에서 실행하는 조건

 

다음 조건이 충족되면 스크립트의 루아 코드는 새로운 스레드에서 실행된다.

  • 비활성화 속성이 false인 경우
  • Workspace 아래에 존재하거나 ServerScriptService에 존재하는 경우

 

조건을 만족하지 않거나 종료나 오류가 발생하지 않으면 그냥 계속 실행된다.

 

 

- 상위 객체

 

스크립트의 상위 객체가 파괴되면 스레드는 멈추지만, Parent 프로퍼티를 nil로 초기화해도 스트립트는 계속 실행된다.

 

 

- 서버와 관련있는 스크립트

 

서버에 있는 객체, 프로퍼티, 이벤트에 접근할 수 있다. 예를 들어 BadgeService를 활용하여 스크립트에서 배지를 수여할 수 없지만 클라이언트에서 코드를 실행하는 로컬 스트립트에서는 불가능하다.

로컬 스크립트에서 수행된 것들은 리플리케이션되지 않기 때문에 스크립트에서 보이지 않는다.

 

* 정의

 

로컬 스트립트(LocalScript)는 서버와 연결된 클라이언트에서 루아 코드를 실행하는 도구다. 카메라와 같은 클라이언트 전용 객체(client-only object)에 접근하기 위해 사용된다.

 

// 설명을 읽어보니 클라이언트 전용 코드를 분리해서 작성하기 위해 사용되는 스크립트인 것 같다.

 

 

* 동작 방식

 

- 특징

 

  • 로컬 스트립트에서 실행되는 코드에서 LocalPlayer의 프로퍼티 Players는 클라이언트에서 실행되고 있는 플레이어를 리턴한다.
  • 로컬스크립트는 다음 객체들을 포함하는 곳에서만 루아 코드를 실행한다.
  1. Player의 Backpack(Tool의 자식일 때)
  2. Player의 Character 모델
  3. Player의 PlayerGui
  4. Player의 PlayerScripts
  5. ReplicatedFirst 서비스

 

로컬 스크립트에서 수행된 것들은 리플리케이션되지 않기 때문에 스크립트에서 보이지 않는다.

 

 

+ Recent posts