为什么我的对象的位置与对象的领域不同?

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),而它实际上存在于局部坐标中。我在这里提出的更改将网格移动到本地坐标。