Unity: Ray로 오브젝트 설치하기

이재형·2024년 6월 4일
0
post-thumbnail
post-custom-banner

Unity 공부

배운 내용

1. Ray로 오브젝트 설치하기

사진1: 제작 전

사진2: 제작 후

문제 발생: 설치류 아이템을 사용할 때 어떤식으로 설치하는가?

문제 진행: Ray를 발사해서 충돌한 부분에 임시 오브젝트를 생성하여 해결하는 것이 어떤가?

문제 해결: 실제로 Ray를 발사하여 오브젝트 위치 확인이 가능한 것이 확인되고 클릭하면 임시 오브젝트를 삭제하고 실제 오브젝트를 생성하게 함

사진3: Ray를 발사하여 임시 오브젝트를 생성

사진4: 문제 없을 때 마우스 클릭으로 임시 오브젝트를 삭제하고 실제 오브젝트를 생성

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. 깃허브의 머지 중에 작업한 스크립트가 누락이 되는 문제 발생

profile
한국사람
post-custom-banner

0개의 댓글