유니티 다크소울 따라만들기 ch_17 아이템
이 글은 유튜브 Sebastian Graves Create Dark Souls를 보고 따라 만들면서 헷갈리는 부분을 정리한 글입니다.
구현 개요
다크소울의 아이템 줍기를 구현한다. 여기서는 무기 아이템 줍기만을 구현한다.
다크소울의 아이템 줍기는 다음과 같음.
- 닿으면 상호작용이 활성화.
- 상호작용 시 애니메이션 실행.
- 아이템 획득
구현 시작
inputSystem 추가
상호작용 키를 할당해준다.
애니메이션 추가
줍는 애니메이션을 애니메이터에 추가해준다.
PlayerInventoryScript 수정
아이템이 담길 인벤토리
를 리스트로 추가해준다.
지금은 무기 인벤토리만 만든다.
public List<WeaponItem> weaponsInventory;
Interactable 스크립트 추가
실제로 맵에 떨어진 아이템과 데이터상의 아이템은 다른 것이다.
데이터상의 무기 아이템은 이미 있으니 이번에는 맵에 떨어져있는 아이템이 가질 스크립트를 만든다.
Interactable 스크립트는 상호작용 가능한 모든 아이템이 공통으로 가질 특징들을 모아놓은 부모 클래스이다.
public class Interactable : MonoBehaviour
{
public float radius = 0.6f;
public string interactableText;
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.blue;
Gizmos.DrawWireSphere(transform.position, radius);
}
public virtual void Interact(PlayerManager playerManager)
{
Debug.Log("You interacted with an object!");
}
}
WeaponPickUp 스크립트 추가
Interactable을 상속받는 필드 드랍 무기아이템을 위한 스크립트를 작성한다.
Interact를 오버라이드 하여 아이템을 줍는 함수를 구현해서 추가해준다.
public class WeaponPickUp : Interactable
{
public WeaponItem weapon;
public override void Interact(PlayerManager playerManager)
{
base.Interact(playerManager);
PickUpItem(playerManager);
}
private void PickUpItem(PlayerManager playerManager)
{
PlayerInventory playerInventory;
PlayerLocomotion playerLocomotion;
AnimatorHandler animatorHandler;
playerInventory = playerManager.GetComponent<PlayerInventory>();
playerLocomotion = playerManager.GetComponent<PlayerLocomotion>();
animatorHandler = playerManager.GetComponentInChildren<AnimatorHandler>();
playerLocomotion.rigidbody.velocity = Vector3.zero;
animatorHandler.PlayTargetAnimation("Pick Up Item", true);
playerInventory.weaponsInventory.Add(weapon);
Destroy(gameObject);
}
}
InputHandler 스크립트 수정
다음과 같이 입력을 받는 함수를 추가해준다.
public bool a_Input;
...
public void TickInput(float delta)
{
...
HandleInteractingButtonInput();
}
private void HandleInteractingButtonInput()
{
inputActions.PlayerActions.A.performed += inputActions => a_Input = true;
}
PlayerManager 스크립트 수정
아이템과 충돌될 떄만 상호작용이 가능하도록 스크립트를 작성한다.
void Update()
{
...
CheckForInteractableObject();
}
private void LateUpdate()
{
...
inputHandler.a_Input = false;
...
}
public void CheckForInteractableObject()
{
RaycastHit hit;
if (Physics.SphereCast(transform.position, 0.3f, transform.forward, out hit, 1f, cameraHandler.ignoreLayers))
{
if (hit.collider.tag == "Interactable")
{
Interactable interactableObject = hit.collider.GetComponent<Interactable>();
if (interactableObject != null)
{
string interactableText = interactableObject.interactableText;
// UI에 표시될 내용
//print(1);
if (inputHandler.a_Input)
{
hit.collider.GetComponent<Interactable>().Interact(this);
}
}
}
}
}
아이템 추가
아이템을 다음과 같이 추가해줌
댓글남기기