I am writing a field of view method that is learned by Code Monkey. The field of view is made by mesh and I am designing the mesh. If my object (human) moves, the start of the field of view moves faster than object.
this is the script of field of view.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyField : MonoBehaviour
{
private MeshFilter _meshFilter;
public float ViewAngle;
public float ViewDistance;
public int RayCount;
private Mesh _mesh;
private Vector3 _origin;
public LayerMask LayerMask;
private Transform _father;
private void Awake()
{
_meshFilter = GetComponent<MeshFilter>();
_father = transform.parent;
}
void Start()
{
_mesh = new Mesh();
_meshFilter.mesh = _mesh;
}
void Update()
{
_origin = _father.position;
float angle = ViewAngle;
float AngleDecrease = ViewAngle / RayCount;
Vector3[] vertices = new Vector3[RayCount 2];
Vector2[] uv = new Vector2[vertices.Length];
int[] triangles = new int[3 * RayCount];
vertices[0]=_origin;
int triangleIndex = 0;
Debug.Log(_origin);
//draw mesh
for (int i = 1; i < vertices.Length; i )
{
Vector3 dir = new Vector3(Mathf.Cos(angle * (Mathf.PI / 180)), Mathf.Sin(angle * (Mathf.PI / 180)),0);
RaycastHit2D raycastHit2D = Physics2D.Raycast(_origin, dir, ViewDistance, LayerMask);
Vector3 vertice;
if (raycastHit2D.collider == null) {
vertice = _origin dir * ViewDistance;
} else {
vertice = raycastHit2D.point;
}
vertices[i] = vertice;
angle -= AngleDecrease;
if (i >= 2)
{
triangles[0 triangleIndex] = 0;
triangles[1 triangleIndex] = i-1;
triangles[2 triangleIndex] = i;
triangleIndex = 3;
}
}
_mesh.vertices = vertices;
_mesh.uv = uv;
_mesh.triangles = triangles;
}
}
And I check out the position of my object. It is right. All the variables are initialized.
CodePudding user response:
I think the flaw here is that you're making the mesh on the MyField
script, but you're basing the points based on the parent GameObject.
If your parent GameObject is at <0,0>, then your mesh origin is at <0,0>. If your parent GameObject moves to <1,0>, then you're making your mesh origin at <1,0> but your Mesh is local. This means that you're actually setting your mesh to <1,0> <1,0> = <2,0> in world coordinates.
Consider offsetting all your points instead:
void Update()
{
_origin = _father.position;
float angle = ViewAngle;
float AngleDecrease = ViewAngle / RayCount;
Vector3[] vertices = new Vector3[RayCount 2];
Vector2[] uv = new Vector2[vertices.Length];
int[] triangles = new int[3 * RayCount];
//vertices[0]=_origin;
vertices[0]=Vector3.zero; // <------- THIS IS A CHANGE
int triangleIndex = 0;
Debug.Log(_origin);
//draw mesh
for (int i = 1; i < vertices.Length; i )
{
Vector3 dir = new Vector3(Mathf.Cos(angle * (Mathf.PI / 180)), Mathf.Sin(angle * (Mathf.PI / 180)),0);
RaycastHit2D raycastHit2D = Physics2D.Raycast(_origin, dir, ViewDistance, LayerMask);
Vector3 vertice;
if (raycastHit2D.collider == null) {
//vertice = _origin dir * ViewDistance;
vertice = dir * ViewDistance; // <---- THIS IS A CHANGE
} else {
//vertice = raycastHit2D.point;
vertice = raycastHit2D.point - _origin; // <----- THIS IS A CHANGE
}
vertices[i] = vertice;
angle -= AngleDecrease;
if (i >= 2)
{
triangles[0 triangleIndex] = 0;
triangles[1 triangleIndex] = i-1;
triangles[2 triangleIndex] = i;
triangleIndex = 3;
}
}
_mesh.vertices = vertices;
_mesh.uv = uv;
_mesh.triangles = triangles;
}
Just a few changes here. Again, I think your issue is that you're defining a local object (the Mesh
) in world coordinates when it actually exists in local coordinates. The changes I'm proposing here shift the mesh to local coordinates.