[Unity] 오브젝트 투명화 처리
![[Unity] 오브젝트 투명화 처리](/_next/image?url=https%3A%2F%2Fdata.develog.develrocket.com%2Fupload%2Fdevelog%2Fuser_1777093328305%2F1779630219732-g6pujd%2F_____2026-05-24_224227.png&w=3840&q=75)
본문 로딩 중...
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!
3D 쿼터뷰 게임에서 플레이어가 물체 뒤로 갔을 때 플레이어가 안보이는 현상이 발생한다
현재 만들고 있는 게임에도 똑같이 적용돼서 플레이어가 큰 물체 뒤로 갔을 때
그 물체가 투명화 되는 코드를 작성해봤다.
using System.Collections.Generic;
using UnityEngine;
public class CameraOcclusionHandler : MonoBehaviour
{
[SerializeField]
private Transform player;
[SerializeField]
private LayerMask canopyLayer;
[SerializeField]
private Material originalMaterial;
[SerializeField]
private Material transparentMaterial;
[SerializeField]
private float sphereRadius = 0.5f;
private Camera cam;
private HashSet<Renderer> fadedObjects = new();
private void Awake()
{
cam = Camera.main;
}
private void Update()
{
HashSet<Renderer> hitRenderers = new();
Vector3 direction = cam.transform.position - player.position;
float distance = direction.magnitude;
RaycastHit[] hits = Physics.SphereCastAll(
player.position,
sphereRadius,
direction.normalized,
distance,
canopyLayer
);
foreach (var hit in hits)
{
Renderer[] renderers = hit.collider.GetComponentsInChildren<Renderer>();
foreach (var rend in renderers)
{
hitRenderers.Add(rend);
if (!fadedObjects.Contains(rend))
{
if (rend != null)
rend.material = transparentMaterial;
fadedObjects.Add(rend);
}
}
}
List<Renderer> toRestore = new();
foreach (var rend in fadedObjects)
{
if (!hitRenderers.Contains(rend))
{
if (rend != null)
rend.material = originalMaterial;
toRestore.Add(rend);
}
}
foreach (var rend in toRestore)
fadedObjects.Remove(rend);
}
private void OnDisable()
{
foreach (var rend in fadedObjects)
{
if (rend != null)
rend.material = originalMaterial;
}
fadedObjects.Clear();
}
}
위의 스크립트를 Main Camera에 붙이고 필드들을 다 연결해준다
나무 전체를 투명화시키는 것 보단 나무의 위치는 알려줘야할 것 같아서 제일 밑 나무 큐브는 투명화 하지 않았다


아직 나뭇잎 투명화는 어색하게 돼서 나중에 다시 손봐줘야 한다...