動態(tài)設(shè)置地形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));
//如果在圓內(nèi)
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);
    // 獲取這個游戲?qū)ο蟮匦胃叨葓D的位置 
    return new Vector3((coord.x * mapWidth), 0, (coord.z * mapHeight));
}

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

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肯夏,一起剝皮案震驚了整個濱河市鸡典,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖赃梧,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掐松,死亡現(xiàn)場離奇詭異齐鲤,居然都是意外死亡瓦糟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門修己,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恢总,“玉大人,你說我怎么就攤上這事睬愤∑拢” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵尤辱,是天一觀的道長砂豌。 經(jīng)常有香客問我,道長光督,這世上最難降的妖魔是什么阳距? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮结借,結(jié)果婚禮上筐摘,老公的妹妹穿的比我還像新娘。我一直安慰自己船老,他們只是感情好蓄拣,可當(dāng)我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著努隙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辜昵。 梳的紋絲不亂的頭發(fā)上荸镊,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機與錄音堪置,去河邊找鬼躬存。 笑死,一個胖子當(dāng)著我的面吹牛舀锨,可吹牛的內(nèi)容都是我干的岭洲。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼坎匿,長吁一口氣:“原來是場噩夢啊……” “哼盾剩!你這毒婦竟也來了雷激?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤告私,失蹤者是張志新(化名)和其女友劉穎屎暇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驻粟,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡根悼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜀撑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挤巡。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖酷麦,靈堂內(nèi)的尸體忽然破棺而出矿卑,到底是詐尸還是另有隱情,我是刑警寧澤贴铜,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布粪摘,位于F島的核電站,受9級特大地震影響绍坝,放射性物質(zhì)發(fā)生泄漏徘意。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一轩褐、第九天 我趴在偏房一處隱蔽的房頂上張望椎咧。 院中可真熱鬧,春花似錦把介、人聲如沸勤讽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚牍。三九已至,卻和暖如春巢墅,著一層夾襖步出監(jiān)牢的瞬間诸狭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工君纫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驯遇,地道東北人。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓蓄髓,卻偏偏與公主長得像叉庐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子会喝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 人來人往陡叠,兩人相遇玩郊,總要有一個要先笑的;兩人相離匾竿,總有一個人得先轉(zhuǎn)身瓦宜。
    楠星閱讀 80評論 0 0
  • 昨天發(fā)生的事情還是有影響自己的心態(tài),(態(tài)度嚴(yán)厲岭妖,板臉临庇,責(zé)怪新同事出錯,并且用怎么這點事情都做不好的態(tài)度跟對方說出錯...
    高爽gs閱讀 528評論 0 0
  • 材料:黃油100g昵慌,低筋面粉65g假夺,糖粉50g,檸檬皮削1小勺斋攀,檸檬汁15ml已卷,鹽1/4匙 第一步:檸檬皮削的量差...
    艷霞Rainbow閱讀 228評論 0 1