Я sh не меняется программно - PullRequest
0 голосов
/ 13 февраля 2020

Итак, я пытаюсь создать свою собственную версию приключенческого кодирования Себастьяна Лауга (https://www.youtube.com/watch?v=M3iI2l0ltbE), и у меня есть сценарий, который генерирует перлин-шум в местности на оси Y и я пытаюсь сделайте так, чтобы он создавал перлин-шум для осей x, y и z и компилировал вершины из этого перлин-шума в me sh. Теперь я нахожусь в процессе добавления кода, чтобы решить, какие точки следует поместить в me sh Проблема в том, что мне нужно заменить переменную y в строках 49 - 56 на переменную ypn (объявлено в строке 45) и оставить переменные y вне этой области в одиночку, проблема в том, что если я изменю одну из этих переменных y (не знаю, какая из них), это сделает me sh плоским, а это не то, что я хочу, тогда будет хуже. Если вы попытаетесь вернуть переменную, которую вы изменили, обратно на y, это ничего не изменит. Это всегда сделает me sh плоским, если вы не создадите новый скрипт. Мой код:

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

public class MapGen : MonoBehaviour
{
    Mesh mesh;
    Material material;

    Vector3[] vertices;
    int[] triangles;
    Vector2[] uvs;
    Vector3[] interest;

    public int xSize = 20;
    public int zSize = 20;
    public int ySize = 20;
    [Range(-1, 1)]
    public float Surface = 0;
    public float Weight = 1;
    float minHeight = 0;
    float maxHeight = 0;

    // Start is called before the first frame update
    void Start()
    {
        mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;

        CreateShape();
        UpdateMesh();
    }
    void CreateShape()
    {
        vertices = new Vector3[(xSize + 1) * (zSize + 1)];


        Texture2D texture = new Texture2D(xSize, zSize, TextureFormat.ARGB32, false);
        for (int y = 0; y <= ySize; y++)
        {
            for (int i = 0, z = 0; z <= zSize; z++)
            {
                for (int x = 0; x <= xSize; x++)
                {
                    float ypn = (Mathf.PerlinNoise(x * .3f, z * .3f) * 2f) * Weight;

                    vertices[i] = new Vector3(x, ypn, z);

                    if (y <= minHeight)
                        minHeight = y;
                    else
                    {
                        if (y >= maxHeight)
                            maxHeight = y;
                    }
                    var result = Mathf.Lerp(minHeight, maxHeight, Mathf.InverseLerp(0, 1, y));
                    texture.SetPixel(x, z, new Color(y, x, 1));

                    i++;
                }
            }
        }

        texture.Apply();
        GetComponent<Renderer>().material.mainTexture = texture;

        triangles = new int[xSize * zSize * 6];

        int vert = 0;
        int tris = 0;

        for (int z = 0; z < zSize; z++)
        {
            for (int x = 0; x < xSize; x++)
            {
                triangles[tris + 0] = vert + 0;
                triangles[tris + 1] = vert + xSize + 1;
                triangles[tris + 2] = vert + 1;
                triangles[tris + 3] = vert + 1;
                triangles[tris + 4] = vert + xSize + 1;
                triangles[tris + 5] = vert + xSize + 2;

                vert++;
                tris += 6;
            }
            vert++;
        }
        uvs = new Vector2[vertices.Length];

        for (int i = 0, z = 0; z <= zSize; z++)
        {
            for (int x = 0; x <= xSize; x++)
            {
                uvs[i] = new Vector2((float)x / xSize, (float)z / zSize);
                i++;
            }
        }
    }
    void UpdateMesh()
    {
        mesh.Clear();

        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.uv = uvs;


        mesh.RecalculateNormals();
        MeshCollider meshc = gameObject.AddComponent(typeof(MeshCollider)) as MeshCollider;
        meshc.sharedMesh = mesh;

    }
}

Примечание: при использовании unity 2019.2.15

Скрипт прикреплен к пустому игровому объекту с рендерером me sh и фильтром me sh для значений по умолчанию, равных единице

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