public void Use()
{
if (data.type == ItemType.Consumable)
{
UseConsumable();
}
else if (data.type == ItemType.Equipment)
{
Debug.Log("장비 아직 미정");
}
// 아이템 종류가 Build일 때
else if(data.type == ItemType.Build)
{
GameManager.Instance.Player.creaft.GetData(data);
}
}
public class PlayerCraft : MonoBehaviour
{
ItemData data;
GameObject PreviwerObject;
RaycastHit hitInfo;
public LayerMask layerMask;
bool creaftMode = false;
Camera camera;
private void Start()
{
data = null;
camera = Camera.main;
}
public void GetData(ItemData data)
{
// 크래프트 모드일 경우 데이터 받지 못하게 함
if (this.data != null) return;
PreviwerObject = Instantiate(data.ViewObject);
this.data = data;
}
private void Update()
{
if (data != null)
{
ViewerItemUpdate();
}
}
private void ViewerItemUpdate()
{
if (Physics.Raycast(camera.transform.position, camera.transform.forward, out hitInfo, 10, layerMask))
{
if (hitInfo.transform != null)
{
PreviwerObject.transform.position = hitInfo.point;
if (creaftMode)
{
Instantiate(data.dropPrefab, hitInfo.point, Quaternion.identity);
data = null;
PreviwerObject = null;
}
}
}
}
public void OnBuild(InputAction.CallbackContext context)
{
if(context.phase == InputActionPhase.Started)
{
creaftMode = true;
}
else if(context.phase == InputActionPhase.Canceled)
{
creaftMode = false;
}
}
}
설명:
1. 아이템 타입이 Build인 아이템을 사용 시 PlayerCraft의 ItemData의 변수로 값을 저장시킴
2. 아이템을 가지게 되면 ItemData의 정보에 ViewObject의 임시 설치 오브젝트를 생성시킴
3. Update문으로 data가 존재시 Raycast를 발사하여 Ground인 레이어마스크에 충돌 시 임시 생성한 오브젝트의 위치를 충돌한 지점으로 변경시킴
4. 그리고 OnBuild()로 클릭을 하게 되면 true 떼면 false로 만들어 충돌 때 true라면 실제 오브젝트를 충돌한 위치에 생성시킴
5. 실제 오브젝트를 생성시켰으므로 저장했던 임시 오브젝트와 아이템 정보를 삭제시킴
1. 생성할 위치를 미리 Ray를 발사하여 충돌 부분에 설치류 아이템을 보여주고 클릭하여 실제 오브젝트를 설치
1. 마우스로 선택해야하는 UI가 1개라도 생성 시 다른 UI를 닫아도 커서가 보이게 하기
1. 깃허브의 머지 중에 작업한 스크립트가 누락이 되는 문제 발생