动态设置地形2

using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
public Vector3 point;
public Terrain TerrainS;
public float BiSuanDaXiao = 200;
public Projector BlobShadowProjector;
protected int hmWidth; // heightmap width 高度图的宽度
protected int hmHeight; // heightmap height 高度图的高度
float[,] heightMapBackup;
public float Hight = 1;
public bool ISGG;
void Start()
{
TerrainS = transform.GetComponent<Terrain>();
BlobShadowProjector = GameObject.Find("Cube").GetComponent<Projector>();
//获取高度图的宽度
hmWidth = TerrainS.terrainData.heightmapWidth;
//获取高度图的高度
hmHeight = TerrainS.terrainData.heightmapHeight;
heightMapBackup = TerrainS.terrainData.GetHeights(0, 0, hmWidth, hmHeight);
}
void OnGUI()
{
if (GUILayout.Button(ISGG.ToString())) { ISGG = !ISGG; }
}
void Update()
{
BlobShadowProjector.orthographicSize = BiSuanDaXiao - 20;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
point = hit.point;
//BlobShadowProjector.transform.position = new Vector3(point.x, BlobShadowProjector.transform.position.y, point.z);
}
if (Input.GetMouseButton(1))
{
DeformTerrain(point, BiSuanDaXiao);
}
if (Input.GetMouseButtonDown(0))
{ ISGG = !ISGG; }
}
//变形的
protected void DeformTerrain(Vector3 pos, float craterSizeInMeters)
{
//获得点
Vector3 terrainPos = GetRelativeTerrainPositionFromPos(pos, TerrainS, hmWidth, hmHeight);
//高度图的宽度采样图世界单位的地形的
int heightMapCraterWidth = (int)(craterSizeInMeters * (hmWidth / TerrainS.terrainData.size.x));
//高度图的长度
int heightMapCraterLength = (int)(craterSizeInMeters * (hmHeight / TerrainS.terrainData.size.z));
//高度图开始点X
int heightMapStartPosX = (int)(terrainPos.x - (heightMapCraterWidth / 2)); //高度图开始点Z
int heightMapStartPosZ = (int)(terrainPos.z - (heightMapCraterLength / 2)); //地图高度阵列
float[,] heights = TerrainS.terrainData.GetHeights(heightMapStartPosX, heightMapStartPosZ, heightMapCraterWidth, heightMapCraterLength);
// 圆心x
float circlePosX;
// 圆心y
float circlePosY;
//中心距
float distanceFromCenter;
//我们组的大小地形每个样品所需的高度
for (int i = 0; i < heightMapCraterLength; i++) //width
{
for (int j = 0; j < heightMapCraterWidth; j++) //height
{//圆判断
circlePosX = (j - (heightMapCraterWidth / 2)) / (hmWidth / TerrainS.terrainData.size.x);
circlePosY = (i - (heightMapCraterLength / 2)) / (hmHeight / TerrainS.terrainData.size.z);
distanceFromCenter = Mathf.Abs(Mathf.Sqrt(circlePosX * circlePosX + circlePosY * circlePosY));
//如果在圆内
if (distanceFromCenter < (craterSizeInMeters / 2))
{
if (ISGG)
{
heights[i, j] = heightMapBackup[i + heightMapStartPosZ, j + heightMapStartPosX];
}
else
{
heights[i, j] = Hight;
}
}
}
}
//修改高度
TerrainS.terrainData.SetHeights(heightMapStartPosX, heightMapStartPosZ, heights);
}
//的到正确的地形位置
protected Vector3 GetNormalizedPositionRelativeToTerrain(Vector3 pos, Terrain terrain)
{
Vector3 tempCoord = (pos - terrain.gameObject.transform.position);
Vector3 coord;
coord.x = tempCoord.x / TerrainS.terrainData.size.x;
coord.y = tempCoord.y / TerrainS.terrainData.size.y;
coord.z = tempCoord.z / TerrainS.terrainData.size.z;
return coord;
}

//得到相对的地形位置 
protected Vector3 GetRelativeTerrainPositionFromPos(Vector3 pos, Terrain terrain, int mapWidth, int mapHeight)
{
    Vector3 coord = GetNormalizedPositionRelativeToTerrain(pos, terrain);
    // 获取这个游戏对象地形高度图的位置 
    return new Vector3((coord.x * mapWidth), 0, (coord.z * mapHeight));
}

void OnApplicationQuit()
{
    //退出程序地形还原
    TerrainS.terrainData.SetHeights(0, 0, heightMapBackup);
}

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 人来人往,两人相遇,总要有一个要先笑的;两人相离,总有一个人得先转身。
    楠星阅读 937评论 0 0
  • 昨天发生的事情还是有影响自己的心态,(态度严厉,板脸,责怪新同事出错,并且用怎么这点事情都做不好的态度跟对方说出错...
    高爽gs阅读 3,658评论 0 0
  • 材料:黄油100g,低筋面粉65g,糖粉50g,柠檬皮削1小勺,柠檬汁15ml,盐1/4匙 第一步:柠檬皮削的量差...
    艳霞Rainbow阅读 1,751评论 0 1

友情链接更多精彩内容