일단 게임엔진은 유니티고요 Raycast 방식으로 시야각을 만들었는데요.
씨발 시야각이 반대로 나옵니다 가려진 부분은 투명하고 가려지지 않아야 할 부분은 가려져요.
진짜 너무 힘들어서 AI한테도 물어봤는데 별로 쓸모있는 답변이 나오지가 않습니다.
심지어 영어로 검색해봤는데도 별로 유용한 답변이 나오지가 않아요.
일단 제가 생각하기로는 일단 먼저 전부 어떤 걸로 화면을 가리고 시야각으로 Mesh를 그려서
그 Mesh가 그려진 부분은 투명해지게 하고 다른 부분은 원래대로 가려지면 되는 것 같습니다.
그런데 문제는 그게 진짜 너무 힘듭니다.
제발 도와주세요 진짜로 더 정보 필요하시면 드리겠습니다.
코드도 올리라고 해서 코드도 올립니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FieldOfView : MonoBehaviour
{
public float viewRadius = 5f;
public int rayCount = 60;
public LayerMask obstacleMask;
private Mesh mesh;
private Vector3 origin;
private List<Vector3> vertices;
private List<int> triangles;
void Start()
{
mesh = new Mesh();
GetComponent<MeshFilter>().mesh = mesh;
origin = Vector3.zero;
}
void LateUpdate()
{
this.transform.position = GameObject.FindWithTag("Player").transform.position;
GenerateFieldOfView();
}
void GenerateFieldOfView()
{
float angle = 0f;
float angleIncrease = 360f / rayCount;
vertices = new List<Vector3>();
triangles = new List<int>();
vertices.Add(Vector3.zero); // 중심점
for (int i = 0; i <= rayCount; i++)
{
Vector3 dir = DirFromAngle(angle);
RaycastHit2D hit = Physics2D.Raycast(this.transform.position, dir, viewRadius, obstacleMask);
Vector3 endPointWorld = hit.collider ? (Vector3)hit.point : this.transform.position + dir * viewRadius;
Vector3 endPointLocal = transform.InverseTransformPoint(endPointWorld);
vertices.Add(endPointLocal);
if (i > 0)
{
triangles.Add(0);
triangles.Add(i);
triangles.Add(i + 1);
}
angle -= angleIncrease;
}
mesh.Clear();
mesh.vertices = vertices.ToArray();
mesh.SetTriangles(triangles.ToArray(), 0);
}
Vector3 DirFromAngle(float angle)
{
float rad = angle * Mathf.Deg2Rad;
return new Vector3(Mathf.Cos(rad), Mathf.Sin(rad));
}
public void SetOrigin(Vector3 pos)
{
origin = transform.InverseTransformPoint(pos);
}
}
부디 도움이 되었으면 합니다.
그리고 아래의 저 AI의 답변을 이해하면 될 것 같은데 도통 뭔 말인지 모르겠습니다.
그리고 shader 이녀석을 어케 하면 될 것 같기는 한데 제가 이녀석에 대해서는 조금도 아는 바가 없어서 미치겠습니다.
나도 좆밥이지만 진짜 긴급해보여서 보태주고싶은데 정보가 너무없다 ㅋㅋ 그냥 반대로 뭐하나 실수한거같은데 코드라도 한번 쭉 올려보셈
트라이앵글 애드에 0 i i+1 넣지말고 0 i+1 i 넣어보셈
안되면몰루
안되긴 하는데 그래도 도와줄려고 해줘서 고마워
@ㅇㅇ(121.135) ㅎㅎ ㅈㅅ!!
일단 추가로 제 추측인데 아마 Mesh를 2개로 해서 한개는 검은색으로 하고 한개는 투명하게 해서 투명한 것만 코드에 적용시키면 뭔가 될 것 같기는 한데 잘 모르겠습니다.
가려질 부분과 보여질 부분이 반대로 나온다? << 이게 힌트 같은데 로직에서 뭔가 반대부분을 날려버리는 거 같은데
네 저도 그렇게 생각하는데 어떻게 반대로 하는지를 모르겠습니다
Materials가 Dark인데, 메서드는 시야 범위의 밝은 부분을 계산하는거 같음
시야 범위내의 모든 끝점들로 먼저 어둡게 덮고 그 위에 투명 메쉬 별도로 올려야할듯
angle += angleIncrease; 아님? 아님말고
이걸 직접 ㄷㄷ 저였음 걍 에셋 샀을듯
ai가 말한 쉐이더는 대충 이런겁니다..
https://wincnt-shim.tistory.com/404
보통은 벽뒤에 숨은 캐릭터를 다른 재질로 보이게 하는데 많이 사용됩니다...