이전에 공부했던 3D Suvival 게임을 기반으로 기능을 추가하여 만들기로 했다.

내가 맡은 부분은 건축으로, 여러 가지 구조물과 아이템을 제작하는 부분을 맡았다.

 

제작창

Input System으로 캐릭터 컨트롤러 스크립트를 불러와서 R키를 누르면 제작창이 키고 꺼지도록 하였다. 

public GameObject craftingWindow;

private PlayerController controller;

private void Awake()
{
    controller = GetComponent<PlayerController>();
}

private void Start()
{
    craftingWindow.SetActive(false);
}

public void OnCraftingTableButton(InputAction.CallbackContext callbackContext)
{
    if (callbackContext.phase == InputActionPhase.Started)
    {
        Toggle();
    }
}

public void Toggle()
{
    if (craftingWindow.activeInHierarchy)
    {
        craftingWindow.SetActive(false);
        controller.ToggleCursor(false);
    }
    else
    {
        craftingWindow.SetActive(true);
        controller.ToggleCursor(true);
    }
}

public bool IsOpen()
{
    return craftingWindow.activeInHierarchy;
}

 

제작창에서 제작할 구조물이나 아이템을 클릭하면 설명과 함께 제작 버튼이 활성화 된다.

private Button craftTabSelectBtn;
[SerializeField] private GameObject craftInforPanel;

private void Start()
{
    craftInforPanel.SetActive(false);
    craftTabSelectBtn = GetComponent<Button>();
    craftTabSelectBtn?.onClick.AddListener(() => OpenPanel());
}

public void OpenPanel()
{
    craftInforPanel.SetActive(true);
}

 

 

구조물 및 건물 건축

제작버튼을 누르면 제작창이 닫히고 미리보기 프리팹이 보이면서 플레이어를 따라가고, 좌클릭하면 프리팹이 사라지고 실제 구조물이 설치된다.

여러 개를 제작할 수 있도록 배열로 구조물들을 저장한다.

[System.Serializable]
public class Craft
{
    public string craftName;
    public GameObject buildCraft; // 실제 설치되는 구조물
    public GameObject previewCraft; // 설치 미리보기
}

public class CraftBuild : MonoBehaviour
{
    private bool isPreviewActivated = false;

    [SerializeField] private Craft[] craftCampfire;
    private GameObject varPreviewCraft; // 미리보기 변수
    private GameObject varBuildCraft; // 실제 설치되는 구조물 변수

    [SerializeField] private Transform playerPosition;
    private RaycastHit hitInfor;
    [SerializeField] private LayerMask layerMask;
    [SerializeField] private float range;

    [SerializeField] private GameObject craftingWindow;

    private void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Build();
        }
    }

    private void Build()
    {
        if (isPreviewActivated)
        {
            Debug.Log("Create");
            Instantiate(varBuildCraft, varPreviewCraft.transform.position, Quaternion.identity);
            Destroy(varPreviewCraft);
            isPreviewActivated = false;
            craftingWindow.SetActive(false);
            varPreviewCraft = null;
            varBuildCraft = null;
        }
    }

    public void CreateBtnClick(int craftNum)
    {        
        varPreviewCraft = Instantiate(craftCampfire[craftNum].previewCraft, playerPosition.position + playerPosition.forward, Quaternion.identity);
        varPreviewCraft.transform.parent = playerPosition;
        varBuildCraft = craftCampfire[craftNum].buildCraft;
        isPreviewActivated = true;
        craftingWindow.SetActive(false);
        PlayerController.instance.ToggleCursor(false);
    }
}

 

 

다른 구조물도 추가할 예정인데 코드가 효율적이진 않은 것 같다. 실전과 이론을 함께 병행하며 좀 더 고민해보면 좋을 것 같은데 시간에 대한 아쉬움이 많고 이해력도 좋지 못해서 생각이 오래 걸려서 아쉽다. 구현하고 싶은 건 정말 많은데 어떤 식으로 방향을 잡아야할지 막막하다. 금방 뚝딱 만들 수 있는 경지까진 바라지 않아도 어떻게 구현할지 감을 잡을 수 있으면 좋겠다.

+ Recent posts