这是没有阴影的游戏界面
首先在Canvas中创建两个纯色image图片,分别命名为Make和MakeBg。然后对两个UI的材质球进行配置,使得Make变成穿透层而MakeBg变成黑幕层:
配置成功之后的效果:
然后建立一个物理射线发射机来获得可见视线,具体代码如下:
public class GameSight : MonoBehaviour {
[SerializeField]
private LayerMask layerMask = new LayerMask();
[SerializeField]
private GameObject myMask = null;
private CanvasRenderer myRenderer = null;
private Mesh mesh;
private float fov;
private float viewDistance;
private Vector3 origin;
private float startingAngle;
//初始化
private void Start() {
myRenderer = GetComponent<CanvasRenderer>();
myMask.SetActive(true);
fov = 360f;
viewDistance = 15f;
origin = Vector3.zero;
}
private void LateUpdate()
{
mesh = new Mesh();
int rayCount = 800;
float angle = startingAngle;
float angleIncrease = fov / rayCount;
Vector3[] vertices = new Vector3[rayCount + 1 + 1];
Vector2[] uv = new Vector2[vertices.Length];
int[] triangles = new int[rayCount * 3];
vertices[0] = origin;
int vertexIndex = 1;
int triangleIndex = 0;
for (int i = 0; i <= rayCount; i++) {
Vector3 vertex;
RaycastHit2D raycastHit2D = Physics2D.Raycast(origin, FunLib.GetVectorFromAngle(angle), viewDistance, layerMask);
if (raycastHit2D.collider == null) {
// No hit
vertex = origin + FunLib.GetVectorFromAngle(angle) * viewDistance * 45f;
} else {
// Hit object
Vector2 vector2 = raycastHit2D.point - new Vector2(origin.x, origin.y);
if (vector2.x > vector2.y)
{
vertex = vector2 * 45;
}
else
{
vertex = vector2 * 45;
}
}
vertices[vertexIndex] = vertex;
if (i > 0) {
triangles[triangleIndex + 0] = 0;
triangles[triangleIndex + 1] = vertexIndex - 1;
triangles[triangleIndex + 2] = vertexIndex;
triangleIndex += 3;
}
vertexIndex++;
angle -= angleIncrease;
}
mesh.vertices = vertices;
mesh.uv = uv;
mesh.triangles = triangles;
mesh.bounds = new Bounds(origin, Vector3.one * 1000f);
myRenderer.SetMesh(mesh);
}
//设置起始点
public void SetOrigin(Vector3 origin) {
this.origin = origin;
}
//设置方向
public void SetAimDirection(Vector3 aimDirection) {
startingAngle = FunLib.GetAngleFromVectorFloat(aimDirection) + fov / 2f;
}
public void SetFoV(float fov) {
this.fov = fov;
}
public void SetViewDistance(float viewDistance) {
this.viewDistance = viewDistance;
}
}
然后在操作台中进行配置:
这样就基本完成了目标,可以启动查看效果:
可以看到和未启动的游戏有了很大的区别。