Вот скрипт:
Код: Выделить всё
public class FieldOfView : MonoBehaviour
{
[SerializeField] private LayerMask layerMask;
private Mesh mesh;
//create mesh
private float fov;
private Vector3 origin;
private float startingAngle;
private void Start()
{
mesh = new Mesh();
GetComponent().mesh = mesh;
fov = 90f;
origin = Vector3.zero;
}
private void LateUpdate()
{
Vector3 origin = Vector3.zero;
int rayCount = 100;
float angle = startingAngle;
float angleIncrease = fov / rayCount;
float viewDistance = 10f;
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 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;
}
public void SetOrigin(Vector3 origin)
{
this.origin = origin;
}
public void SetAimDirection(Vector3 aimDirection)
{
startingAngle = GetAngleFromVectorFloat(aimDirection) + fov / 2f;
}
public static Vector3 GetVectorFromAngle(float angle)
{
float angleRad = angle * (Mathf.PI / 180f);
return new Vector3(Mathf.Cos(angleRad), Mathf.Sin(angleRad));
}
public static float GetAngleFromVectorFloat(Vector3 dir)
{
dir = dir.normalized;
float n = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
if (n < 0) n += 360;
return n;
}
}
Код: Выделить всё
public class PlayerAim : MonoBehaviour
{
[SerializeField] private FieldOfView fieldOfView;
void Update()
{
Vector3 targetPosition = GetMouseWorldPosition();
Vector3 aimDir = (targetPosition - transform.position).normalized;
fieldOfView.SetAimDirection(aimDir);
fieldOfView.SetOrigin(transform.position);
}
public static Vector3 GetMouseWorldPosition()
{
Vector3 vec = GetMouseWorldPositionWithZ(Input.mousePosition, Camera.main);
vec.z = 0f;
return vec;
}
public static Vector3 GetMouseWorldPositionWithZ()
{
return GetMouseWorldPositionWithZ(Input.mousePosition, Camera.main);
}
public static Vector3 GetMouseWorldPositionWithZ(Camera worldCamera)
{
return GetMouseWorldPositionWithZ(Input.mousePosition, worldCamera);
}
public static Vector3 GetMouseWorldPositionWithZ(Vector3 screenPosition, Camera worldCamera)
{
Vector3 worldPosition = worldCamera.ScreenToWorldPoint(screenPosition);
return worldPosition;
}
public static Vector3 GetDirToMouse(Vector3 fromPosition)
{
Vector3 mouseWorldPosition = GetMouseWorldPosition();
return (mouseWorldPosition - fromPosition).normalized;
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... ppreciated