Почему мой me sh полностью исчезает, когда только его часть выходит за пределы экрана - PullRequest
0 голосов
/ 29 мая 2020

Я использую следующий код для создания плоскости в форме полосы.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DynamicPlane : MonoBehaviour
{
    private GameObject _plane;
    private Mesh _planeMesh;
    private MeshRenderer _planMeshRenderer;
    private List<Vector3> _planeMeshVertices;
    private int[] _planeMeshIndices;

    // Start is called before the first frame update
    void Start()
    {
        _plane = new GameObject("My Plane");
        _plane.AddComponent<MeshFilter>();
        _plane.AddComponent<MeshRenderer>();
        _planeMeshVertices = new List<Vector3>() { Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero };
        _planeMeshIndices = new int[6] { 0, 1, 2, 2, 1, 3 };
        _planeMesh = new Mesh();
        _planeMesh.SetVertices(_planeMeshVertices);
        _planeMesh.SetIndices(_planeMeshIndices, MeshTopology.Triangles, 0);
        _plane.GetComponent<MeshFilter>().sharedMesh = _planeMesh;
        _planMeshRenderer = _plane.GetComponent<MeshRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        _planeMeshVertices[0] = new Vector3(1, 0, 0);
        _planeMeshVertices[1] = new Vector3(0, 0, 0);
        _planeMeshVertices[2] = new Vector3(1, 0, 50);
        _planeMeshVertices[3] = new Vector3(0, 0, 50);
        _planeMesh.SetVertices(_planeMeshVertices);
    }

}

Я устанавливаю вершины в Update (), потому что в реальном проекте мне нужно динамически изменять положение вершин.

Запустите игру и проверьте вид сцены. Фиолетовая полоса - это мой самолет, созданный с помощью кода, а белая плоскость - примитив. Полоса полностью исчезает, когда только крошечная ее часть выходит за пределы экрана. Белый самолет нормальный. Почему это происходит?

enter image description here

enter image description here

1 Ответ

1 голос
/ 29 мая 2020

Проблема

Unity отбраковывает объекты, которые находятся за пределами экрана, используя Render.bounds, которые в основном являются Mesh.bounds но с примененными локальными преобразованиями (положение, поворот, масштаб).

В момент создания меня sh через

_planeMesh = new Mesh();

этот me sh пуст и принимает значение по умолчанию bounds (center 0,0,0 and extends 0,0,0).

Позже, когда вы меняете ветки, вы не вычисляете новые границы, но все равно используете начальные.

Следовательно, вы заметили, что "неправильное" удаление происходит только в том случае, если нижний левый угол (находящийся на 0,0,0) покидает экран, поскольку Unity думает, что это все ваше Я sh.

enter image description here

Решение

Каждый раз, когда вы меняете что-то во мне sh, вы должны звонить RecalculateBounds, чтобы обновить границы.

void Update()
{
    _planeMeshVertices[0] = new Vector3(1, 0, 0);
    _planeMeshVertices[1] = new Vector3(0, 0, 0);
    _planeMeshVertices[2] = new Vector3(1, 0, 50);
    _planeMeshVertices[3] = new Vector3(0, 0, 50);
    _planeMesh.SetVertices(_planeMeshVertices);

    _planeMesh.RecalculateBounds();
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...