본문 바로가기
유니티 최고/유니티 구현

유니티(Unity) URP환경에서 Shader Graphs를 이용해서 OutLine 생성하기

by Lee_story_.. 2024. 3. 7.
728x90

 

 

저번에 한번 액터 선택시 조금더 큰 투명 액터를 만들어 윤곽선을 준듯이 만든적이 있었는데

 

 

유니티(Unity) AR foundation 오브젝트 선택 / 이동 / 크기조절

오늘은 전 글에 이어서 이번엔 설치한 오브젝트를 선택하고 이동하는 아래의 영상을 참고했습니다! 전 글하고는 코드가 좀 달라졌습니다;;; 이번 코드까지 완성한다면!! 아래 처럼 만들어집니다

ljhyunstory.tistory.com

 

 

이번에는 머터리얼/ 쉐이더를 이용해서 만들어 보았습니다!

 

 

 

아래 블로그와 

 

유니티 URP OutLine Shader Graph

유니티 버전 : 2020.3.25f1(URP) 작업환경 : Mac (Monterey 12.2.1) 이번엔 외곽선을 구현하는 방법에 대해서 알아봤습니다. 유튜브에 정말 친절히 나와있더군요.. 유니티 에셋스토어를 이용해도 되지만 URP

roomdev-diary.tistory.com

 

 

유튜브 영상을 참고 하였습니다. 

 

 

 

 

 

 

첫번째 방법은 윤곽선을 주고 싶은 액터에 조금 더 큰 액터를 덮어씌워주는 방식입니다.

 

우선 URP환경이 구축되어있다면 아래처럼 Unlit Shader Graph를 만들어주고

 

 

그래프를 아래처럼 구성해줍시다.

 

Scale의 기본값은 -1.1로 설정해주고

Position은 Object, Rotate About Axis는 Degrees로 설정해 줍시다.

 

 

그리고 그에 맞는 머터리얼을 생성

 

 

 

 

그후 아래처럼 스크립을 생성한후

 

OutlineScript.cpp

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class OutlineScript : MonoBehaviour
{
    [SerializeField] private Material outlineMaterial;
    [SerializeField] private float outlineScaleFactor;
    [SerializeField] private Color outlineColor;
    private Renderer outlineRenderer;

    void Start()
    {
        outlineRenderer = CreateOutline(outlineMaterial, outlineScaleFactor, outlineColor);
        outlineRenderer.enabled = true;
    }

    Renderer CreateOutline(Material outlineMat, float scaleFactor, Color color)
    {
        GameObject outlineObject = Instantiate(this.gameObject, transform.position, transform.rotation, transform);
        Renderer rend = outlineObject.GetComponent<Renderer>();
        

        rend.material = outlineMat;
        rend.material.SetColor("_OutlineColor", color);
        rend.material.SetFloat("_Scale", scaleFactor);
        rend.shadowCastingMode = ShadowCastingMode.Off;

        outlineObject.GetComponent<OutlineScript>().enabled = false;
        outlineObject.GetComponent<Collider>().enabled = false;

        rend.enabled = false;

        return rend;
    }
}

 

 

윤곽선이 필요한 액터에 스크립을 넣고 아래처럼 작성해주면 끝!

 

 

 

 

윤곽선이 잘 표현되는걸 확인 할 수 있었습니다.

 

 

 

하지만.. .중력같은 물리력이 작동하면 윤곽선이 따라가지 못하는....

 

 

 

 

 

 

 

그래서 찾은 두번째 방법 

두번째 방법은 액터자체에 2개의 머터리얼을 넣어주는 방법이였습니다. 

 

위와 똑같이 Unlit Shader Graph를 하나 만들어 주고

 

이번엔 그래프를 Transparent로 설정해줍시다.

 

 

 

그다음 아래처럼 그래프를 구성한 후 

 

이 그래프를 이용하여 머터리얼을 하나 생성해줍시다.

 

 

그 다음 윤곽선이 필요한 액터의 Mesh Renderer를 설정해주고, 아래로 내려가 머터리얼 설정값을 조절해주면 끝!

 

 

 

이제 물리력을 가해도 떨어지지 않는 OutLine 끝!

 

 

 

 

 

 

 

 

 

 

틀린점이 있다면 댓 달아주세요!

 

 

 

 

 

댓글