为什么我的对象的位置与对象的领域不同?
Why is the position of my object different from the field of object?
我正在写一个被代码猴子学习的视野方法。视野是由网格构成的,我正在设计网格。如果我的物体(人)移动,视野的起点比物体移动得更快。
this is mistake happening
this is the scene
这是视野脚本
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;
}
}
然后我检查了我的对象的位置。这是正确的。所有变量都已初始化。
我认为这里的缺陷是您在 MyField
脚本上制作网格,但是您是基于父游戏对象建立点。
如果您的父游戏对象位于 <0,0>,则您的网格原点位于 <0,0>。如果您的父游戏对象移动到 <1,0>,那么您的网格原点位于 <1,0> ,但您的网格是本地的 。这意味着您实际上是在世界坐标中将网格设置为 <1,0> + <1,0> = <2,0>。
考虑抵消所有积分:
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;
}
这里只是一些改动。同样,我认为您的问题是您在世界坐标中定义了一个局部对象(Mesh
),而它实际上存在于局部坐标中。我在这里提出的更改将网格移动到本地坐标。
我正在写一个被代码猴子学习的视野方法。视野是由网格构成的,我正在设计网格。如果我的物体(人)移动,视野的起点比物体移动得更快。
this is mistake happening
this is the scene
这是视野脚本
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;
}
}
然后我检查了我的对象的位置。这是正确的。所有变量都已初始化。
我认为这里的缺陷是您在 MyField
脚本上制作网格,但是您是基于父游戏对象建立点。
如果您的父游戏对象位于 <0,0>,则您的网格原点位于 <0,0>。如果您的父游戏对象移动到 <1,0>,那么您的网格原点位于 <1,0> ,但您的网格是本地的 。这意味着您实际上是在世界坐标中将网格设置为 <1,0> + <1,0> = <2,0>。
考虑抵消所有积分:
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;
}
这里只是一些改动。同样,我认为您的问题是您在世界坐标中定义了一个局部对象(Mesh
),而它实际上存在于局部坐标中。我在这里提出的更改将网格移动到本地坐标。