Нашел вот такой скрипт, и почему-то он в уже созданном террейне, допустим вытянул гору, так он при нажатии ЛКМ или ПКМ сначала сводит высоту в 0, а уже потом начинает увеличивать.
Почему? Ткните пальцем если не сложно, где ошибка...
Спасибо.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections.Generic;
public class testTerrainData : MonoBehaviour {
public Terrain ter;
private float strength = 0.01f;
private float[,] heights;
// Use this for initialization
void Start () {
heights = ter.terrainData.GetHeights(0, 0, ter.terrainData.heightmapWidth, ter.terrainData.heightmapHeight);
}
// Update is called once per frame
void Update () {
TerrainUpdate();
}
private void TerrainUpdate() //в зависимости от клавиши мыши и рейкаста.
{
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//test;
if (Physics.Raycast(ray, out hit))
Debug.Log("ter.terdata.ray "+hit.collider + "@" + hit.distance + "@" + hit.point);
if (Input.GetMouseButton(0))
{
if (Physics.Raycast(ray, out hit))
{
RaiseTerrain(hit.point);
}
}
if (Input.GetMouseButton(1))
{
if (Physics.Raycast(ray, out hit))
{
LowerTerrain(hit.point);
}
}
}
private void RaiseTerrain(Vector3 point)
{
int mouseX = (int)((point.x / ter.terrainData.size.x) * ter.terrainData.heightmapWidth);
int mouseY = (int)((point.z / ter.terrainData.size.z) * ter.terrainData.heightmapHeight);
float[,] modifiedHeights = new float[1, 1];
float y = heights[mouseX, mouseY];
y += strength * Time.fixedDeltaTime;
if (y > ter.terrainData.size.y)
y = ter.terrainData.size.y;
modifiedHeights[0, 0] = y;
heights[mouseX, mouseY] = y;
ter.terrainData.SetHeights(mouseX, mouseY, modifiedHeights);
}
private void LowerTerrain(Vector3 point)
{
int mouseX = (int)((point.x / ter.terrainData.size.x) * ter.terrainData.heightmapWidth);
int mouseY = (int)((point.z / ter.terrainData.size.z) * ter.terrainData.heightmapHeight);
float[,] modifiedHeights = new float[1, 1];
float y = heights[mouseX, mouseY];
y -= strength * Time.fixedDeltaTime;
if (y < 0)
y = 0;
modifiedHeights[0, 0] = y;
heights[mouseX, mouseY] = y;
ter.terrainData.SetHeights(mouseX, mouseY, modifiedHeights);
}
}
using System.Collections.Generic;
public class testTerrainData : MonoBehaviour {
public Terrain ter;
private float strength = 0.01f;
private float[,] heights;
// Use this for initialization
void Start () {
heights = ter.terrainData.GetHeights(0, 0, ter.terrainData.heightmapWidth, ter.terrainData.heightmapHeight);
}
// Update is called once per frame
void Update () {
TerrainUpdate();
}
private void TerrainUpdate() //в зависимости от клавиши мыши и рейкаста.
{
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//test;
if (Physics.Raycast(ray, out hit))
Debug.Log("ter.terdata.ray "+hit.collider + "@" + hit.distance + "@" + hit.point);
if (Input.GetMouseButton(0))
{
if (Physics.Raycast(ray, out hit))
{
RaiseTerrain(hit.point);
}
}
if (Input.GetMouseButton(1))
{
if (Physics.Raycast(ray, out hit))
{
LowerTerrain(hit.point);
}
}
}
private void RaiseTerrain(Vector3 point)
{
int mouseX = (int)((point.x / ter.terrainData.size.x) * ter.terrainData.heightmapWidth);
int mouseY = (int)((point.z / ter.terrainData.size.z) * ter.terrainData.heightmapHeight);
float[,] modifiedHeights = new float[1, 1];
float y = heights[mouseX, mouseY];
y += strength * Time.fixedDeltaTime;
if (y > ter.terrainData.size.y)
y = ter.terrainData.size.y;
modifiedHeights[0, 0] = y;
heights[mouseX, mouseY] = y;
ter.terrainData.SetHeights(mouseX, mouseY, modifiedHeights);
}
private void LowerTerrain(Vector3 point)
{
int mouseX = (int)((point.x / ter.terrainData.size.x) * ter.terrainData.heightmapWidth);
int mouseY = (int)((point.z / ter.terrainData.size.z) * ter.terrainData.heightmapHeight);
float[,] modifiedHeights = new float[1, 1];
float y = heights[mouseX, mouseY];
y -= strength * Time.fixedDeltaTime;
if (y < 0)
y = 0;
modifiedHeights[0, 0] = y;
heights[mouseX, mouseY] = y;
ter.terrainData.SetHeights(mouseX, mouseY, modifiedHeights);
}
}