본문 바로가기
개발/Unity

Unity ) 맵 오브젝트 투명처리 (Transparent/VertexLit)

by 테샤르 2022. 1. 24.

 맵 오브젝트 투명처리 (Transparent/VertexLit)

 

타겟을 포커싱하는 카메라로 작업을 하다가 발생한 상황으로 

오브젝트가 화면을 가리게되어서 특정하게 해당 오브젝트를 투명하게 처리해줘야하는 경우에 사용한 코드이다.

 

< 샘플 코드 >


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


//[RequireComponent(typeof(CapsuleCollider))]
public class CheckObstacleFromView : MonoBehaviour
{

    //private List<GameObject, MeshRenderer> m_DicOriginal = null;
    private Dictionary<GameObject, MeshRenderer> m_DicMeshRender = new Dictionary<GameObject, MeshRenderer>();
    private Collider m_Collider = null;

    void Start()
    {
        this.m_Collider = this.GetComponent<Collider>();
    }

    void Update()
    {
        if(null == this.m_Collider){
            return;
        }

        //Vector3 ScreenPos = Camera.main.transform.position;
        //Ray ray =Camera.main.ScreenPointToRay(ScreenPos);

        List<Ray> listRay = new List<Ray>();
        
        listRay.Add(new Ray(this.transform.position , Camera.main.transform.position));

        List<RaycastHit[]> listHitInfo = new List<RaycastHit[]>();

        foreach (Ray ray in listRay)
        {
            RaycastHit[] hitInfo = Physics.RaycastAll(ray, 1000.0f);
            listHitInfo.Add(hitInfo);

            Debug.DrawRay(ray.origin, ray.direction * 500, Color.red);
        }

        RaycastHit[] listHit = listHitInfo[0];
        List<GameObject> hitGameObjectList = new List<GameObject>();
        foreach (RaycastHit hit in listHit)
        {
            MeshRenderer renderer = hit.collider.gameObject.GetComponent<MeshRenderer>();

            if ("GameController" != hit.collider.gameObject.tag)
                continue;

            if (null == renderer)
                continue;

            if (null == renderer.material)
                continue;

            hitGameObjectList.Add(hit.collider.gameObject);

        }

        List<GameObject> removeList = new List<GameObject>();
        var dic = this.m_DicMeshRender.GetEnumerator();
        while (dic.MoveNext())
        {
            if (false == hitGameObjectList.Contains(dic.Current.Key))
            {
                //원상태로 변경
                GameObject obj = dic.Current.Key;
                MeshRenderer rendeer = obj.GetComponent<MeshRenderer>();
                rendeer = dic.Current.Value;
                Color prevColor = rendeer.material.GetColor("_Color");
                rendeer.material.SetColor("_Color", new Color(prevColor.r, prevColor.g, prevColor.b, 1f));
                //this.m_DicMeshRender.Remove(obj);
                removeList.Add(obj);
            }
        }

        for(int i = 0; i < removeList.Count;i++){
            this.m_DicMeshRender.Remove(removeList[i]);
        }

        for (int i = 0; i < hitGameObjectList.Count; i++)
        {


            GameObject GObj = hitGameObjectList[i];
            MeshRenderer renderer = GObj.GetComponent<MeshRenderer>();
            if (false == this.m_DicMeshRender.ContainsKey(GObj))
            {
                //this.m_DicMeshRender.Add(GObj, renderer);
                this.m_DicMeshRender.Add(GObj, renderer);
            }

            string nameShader = "Transparent/VertexLit";
            renderer.material.shader = Shader.Find(nameShader);
            if (renderer.material.HasProperty("_Color"))
            {
                Color prevColor = renderer.material.GetColor("_Color");
                renderer.material.SetColor("_Color", new Color(prevColor.r, prevColor.g, prevColor.b, 0.5f));
            }
        }

    }

    private bool FindColliderByName(RaycastHit[] inListRayCastInfo, string inName)
    {
        foreach (RaycastHit hitInfo in inListRayCastInfo)
        {

            if (hitInfo.collider.name == inName)
            { return true; }
        }

        return false;
    }
}

 

반응형

 

원리는 간단하게 Camera의 Ray를 기준으로 Hit 되는 오브젝트를 구분해서 해당 오브젝트가 배경(오브젝트)인지 판단 이후에 해당 오브젝트의 Shader Alpha 값을 변경해주는 코드이다.

 

특정 기준으로 마스크 처리해서 실제로 그려지지 않게 하는 방법도 있지만 이번에는 간단하게

해당 오브젝트의 투명도를 변경해주는 코드로 변경작업했다.

 

 

★☆☆☆☆

 

반응형

댓글