팀과제에서 건축 파트를 맡게 되었다.
아래는 임시 코드.. 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 |