결과

 

A* 알고리즘 구현을 해보기 위해 준비하다가 , 마우스 클릭으로 쉽게 장애물을 만들고 장애물 경로를 피해 찾아갔으면 좋겠다 싶어서 마우스 클릭으로 장애물을 만드는 기능을 구현했다.

 

RayCast를 활용하여 구현 하였고 해당 기능이 있으면 Play를 하여 내가 원하는 경로를 직접 만들어 줄 수 있는것이 장점이다.

 

 

코드는 생각나는데로 하드 코딩하여 썩 좋은 코드는 아니다.

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

public class GridMapGenerator : MonoBehaviour
{
    [SerializeField] private GameObject obstacle;
    [SerializeField] private GameObject selectAreaPrefab;

    public LayerMask Selectlayer;
    private GameObject selectArea;

    float delayClick = 0.1f;
    float curClickTimer;

    private void Awake()
    {
        selectArea = Instantiate(selectAreaPrefab);
    }

    private void Update()
    {
        curClickTimer += Time.deltaTime;

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);


        if (Physics.Raycast(ray,out RaycastHit hit,1000.0f))
        {
            Debug.DrawLine(ray.origin, hit.point, Color.red);
            
            selectArea.transform.position = new Vector3(Mathf.Round(hit.point.x), 0.1f, Mathf.Round(hit.point.z));

            if (Input.GetMouseButton(0) && curClickTimer > delayClick && LayerMatchCheck(hit.transform.gameObject.layer, Selectlayer))
            {
                curClickTimer = 0;

                GameObject obj = Instantiate(obstacle);
                Vector3 pos = new Vector3(selectArea.transform.position.x, 0, selectArea.transform.position.z);
                obj.transform.position = pos;
            }
        }

       
    }

    private bool LayerMatchCheck(int target , LayerMask layer)
    {
        if(layer == (layer.value | 1 << target ))
        {
            return true;
        }

        return false;
    }
}

https://01149.tistory.com/178

 

Unity :: 셰이더 그래프

셰이더 그래프란?HLSL(High Level Shader Language) 코드 작성 없이 노드 기반으로 셰이더를 만들수 있는 기능입니다. 셰이더 그래프 사용 방법?1. Project 부분에서 해당 경로를 따라가서 셰이더 그래프를

01149.tistory.com


 

1. 포트폴리오 제작 중 

출시 목적으로 스토리 + 카드형 턴제 전투 게임을 개발 중이며 , 현재 대화시스템을 구글 스프레드 시트와 연동하여

테스트 중이다.

해당 작업이 완료되는데로 TIL에 따로 작성할 목적

 

2.내일배움캠프에서 진행되는 바로인턴10기 지원

Unity 클라이언트 프로그래머의 취업문이 좁다보니 , 한달동안 인턴 생활을 하는 제도가 있어

지원서를 작성하여 신청하였다. 지원서에 붙으면 서류 및 과제를 이틀동안 작성하여 제출하여야한다.

작성되어 크니브 스튜디오에 인턴이 되었으면 좋겠다. 

 

 

셰이더 그래프

밝기 조절 때문에 노드를 좀 많이 사용 하였음

 

셰이더 그래프
결과화면

셰이더 그래프

 

결과

 

셰이더 그래프란?

HLSL(High Level Shader Language) 코드 작성 없이 노드 기반으로 셰이더를 만들수 있는 기능입니다. 


셰이더 그래프 사용 방법?

URP 코어 사용시

1. Project 부분에서 해당 경로를 따라가서 셰이더 그래프를 만들 수 있다.

셰이더 그래프의 UI 기능

2.우클릭 - Create Node를 사용하여 노드를 만들고 해당 Input에 기능들을 넣어 셰이더를 만들수 있다.

Node 생성

3.생성한 셰이더 그래프로 Material를 생성한다. 

만들어진 셰이더 그래프에 우클릭 후 해당 경로를 따라가면 Material를 생성 할 수 있다.
셰이더그래프를 통해 만들어진 Material

 

4.해당 Material를 사용할 스크립트 코드 작성
//Scene 전환시 사용되는 이펙트 효과로 간단하게 만든 스크립트 입니다.
//나중에 사용할시 Material 호출하여 사용하면 됨 . 

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

public class TransitionScreen : MonoBehaviour
{
    [SerializeField] private Material screenTransitionMaterial;
    [SerializeField] private float transitionTime = 1f;
    [SerializeField] private string prppertyName = "_Scrool";

    public UnityAction OnTransitonDone;

    public void OnTransitionScreen()
    {
        StartCoroutine(TransitionCoroutine());
    }

    private void Start()
    {
        StartCoroutine(TransitionCoroutine());
    }

    private IEnumerator TransitionCoroutine()
    {
        float curretnTime = 0;
        while (curretnTime < transitionTime)
        {
            curretnTime += Time.deltaTime;
            screenTransitionMaterial.SetFloat(prppertyName, Mathf.Lerp(0f, transitionTime, curretnTime));
            yield return null;
        }
        OnTransitonDone?.Invoke();
    }
}

간단하게 씬 전환시 사용되는 이펙트를 만들기위해 스크립트를 만들어 보았다. 

 

5.Unity Scene에 오브젝트 및 컴포넌트 생성

하이어라키에 Scene 전환용 오브젝트(SceneTransition) , 이펙트가 적용될 오브젝트(Quad) 하나 생성

Material을 잘 적용했는지 체크 할 것

 

6.체크

화면 전환


이번 포트폴리오 중 대화시스템을 구현 중에 화면 전환이 필요해서 셰이더 그래프를 익혀보았고

다른 예제들을 찾아보며 적용 중이다. 

UI가 아닌 오브젝트를 클릭해서 이동하는 것을 구현 하고 싶었다.

 

현재 드래그 이동이 아닌 클릭 후 카드를 움직이는 방식으로 구현하였다.

 

public class TestInputController : MonoBehaviour
{
    [SerializeField] private LayerMask cardLayerMask;
    private GameObject cardObject = null;
    private bool isCardSelect = false;

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //화면 좌표계에 있기에 월드 좌표로 변환
            Vector2 worldPos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
            RaycastHit2D hit = Physics2D.Raycast(worldPos, Vector2.zero, 0f, cardLayerMask);

            if (!isCardSelect && hit.collider != null)
            {
                Debug.Log(hit.transform.name);
                cardObject = hit.collider.gameObject;
                isCardSelect = true;
            }
            else if (isCardSelect)
            {
                cardObject = null;
                isCardSelect = false;
            }
        }

        if (cardObject != null)
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
            pos.z = 0;
            cardObject.transform.position = pos;
        }
    }
}

현재 Update() 문으로 구현을 해서 최적화에 좋지 않을것이다. 

1.마우스 클릭 Class를 생성후, event를 등록시켜서 필요할때만 호출 시키는 형식으로 리팩토링이 필요하다. 

2.InputSystem을 활용하여 event로 연동 시킨다.

 

이 두가지 방법 중 하나를 택해서 진행하게 될것같다. 

 

Card Class 안에 IPointerHandler를 상속시켜 쉽게 진행 할 수도 있었겠지만, 

Card에는 카드가 게임에서 사용되는 효과,연출이 담겨 있어야 되고 

Card를 조작하는 것은 InputController에서 담당을 해야 SRP(단일 책임 원칙)을 지킬 수 있을것 같아

이렇게 구현 하였다. 

 

 if (Input.GetMouseButtonDown(0))
        {
            //화면 좌표계에 있기에 월드 좌표로 변환
            Vector2 worldPos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
            RaycastHit2D hit = Physics2D.Raycast(worldPos, Vector2.zero, 0f, cardLayerMask);

이부분은 InputManager 와 InputSystem 둘다 사용 중이기에 하나를 택해서 바꿔서 진행해야 된다. 

 

InputSystem의 현재 마우스 좌표를 반환하는 메서드, 반환값은 Vector2
Layer를 Card로 선언하여 RayCastHit를 이용하여 체크후 이동시킨다.

 

+ Recent posts