TIL

빵어 ㅣ 2023. 12. 19. 00:32

팀과제에서 건축 파트를 맡게 되었다.

아래는 임시 코드.. Update문에 있는 코드들을 Input System을 이용하면서 다 없앨 것이다.

 

청사진으로 생성될 건축물을 미리 볼 수 있고, 마우스 클릭으로 청사진이 있던 자리에 건축물을 생성한다.

건축물이 생성되기 전에 회전, 이동 등을 할 수 있고, 건축물 위에 건축물이 올라갈 수 있도록 구현했다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BuildingSystem : MonoBehaviour
{
    [SerializeField] private Camera _cam;
    [SerializeField] private GameObject _tempPrefab;
    [SerializeField] private LayerMask _groundLayer;

    [SerializeField] private int _raycastRange = 20;
    [SerializeField] private float _yGridSize = 0.1f;
    [SerializeField] private int _rotationAngle = 45;

    [SerializeField] private Material _previewMat;
    [SerializeField] private Material _nonBuildableMat;

    private GameObject _obj;
    private BuildableObject _buildableObject;

    private bool _isHold = false;
    private bool _canCreateObject = true;
    private bool _isBreakMode = false;

    void Update()
    {
        if (_isHold)
        {
            RaycastHit hit = RaycastHit();
            if (hit.collider != null
                && _groundLayer == (_groundLayer | (1 << hit.collider.gameObject.layer)))
                SetObjPosition(hit.point);

            if (Input.GetMouseButtonDown(0) && _canCreateObject)
            {
                _isHold = false;
                _obj.GetComponentInChildren<BoxCollider>().isTrigger = false;
                
                _buildableObject.SetInitialObject();
                _buildableObject.DestroyColliderManager();
            }
            else if (Input.GetKeyDown(KeyCode.Escape))
            {
                Destroy(_obj);
                _isHold = false;
            }
            else if (Input.GetKeyDown(KeyCode.Z))
                _obj.transform.Rotate(Vector3.up, _rotationAngle);
            else if (Input.GetKeyDown(KeyCode.C))
                _obj.transform.Rotate(Vector3.up, -_rotationAngle);
        }
        else if (Input.GetKeyDown(KeyCode.J))
        {
            _isHold = true;
            CreateBluePrintObject(RaycastHit().point);
        }

        if (Input.GetKeyDown(KeyCode.U))
        {
            if(_isHold)
            {
                Destroy(_obj);
                _isHold = false;
            }
            _isBreakMode = _isBreakMode ? false : true;
        }

        if (_isBreakMode)
        {
            GameObject toBeDestroyedObject = RaycastHit().collider.gameObject;
            if (toBeDestroyedObject.layer == 30)
            {
                toBeDestroyedObject.GetComponentInParent<BuildableObject>().SetMaterial(_nonBuildableMat);
                if (Input.GetMouseButtonDown(0))
                    Destroy(toBeDestroyedObject);
            }
        }
    }

    private RaycastHit RaycastHit()
    {
        RaycastHit hit;
        Ray ray = _cam.ScreenPointToRay(Input.mousePosition);
        Physics.Raycast(ray, out hit, _raycastRange);

        return hit;
    }

    private void SetObjPosition(Vector3 hitPos)
    {
        Vector3 _location = hitPos;
        _location.Set(Mathf.Round(_location.x), Mathf.Round(_location.y / _yGridSize) * _yGridSize, Mathf.Round(_location.z));

        _obj.transform.position = _location;
    }

    private void CreateBluePrintObject(Vector3 pos)
    {
        _obj = Instantiate(_tempPrefab);
        SetObjPosition(pos);

        _buildableObject = _obj.GetComponent<BuildableObject>();
        _buildableObject.SetMaterial(_previewMat);

        BuildableObjectColliderManager buildableObject = _obj.GetComponentInChildren<BuildableObjectColliderManager>();
        buildableObject.OnRedMatAction += HandleBuildableObjectTriggerEnter;
        buildableObject.OnBluePrintMatAction += HandleBuildableObjectTriggerExit;
    }

    private void HandleBuildableObjectTriggerEnter()
    {
        _canCreateObject = false;
    }
    
    private void HandleBuildableObjectTriggerExit()
    {
        _canCreateObject = true;
    }
}

'내일배움캠프(Unity)' 카테고리의 다른 글

숙련 주차 3D 강의 정리  (0) 2023.12.23
클린 코드 3  (1) 2023.12.19
비동기와 Coroutine 특강  (0) 2023.12.15
TMP_Text  (0) 2023.12.14
람다함수 안 매개변수 문제  (0) 2023.12.14