生活随笔
收集整理的這篇文章主要介紹了
Unity漫延的实现思路(流体漫延, 火烧草地的漫延等)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
↓首先這是Unity出了個(gè)Bug, 顏色混亂了
白色區(qū)域開始漫延, 當(dāng)它遇到白球的時(shí)候, 會(huì)向兩邊分叉漫延.
這就很神奇.
顏色也會(huì)有碰撞嗎?
我想實(shí)現(xiàn)這種效果, 于是去網(wǎng)上搜實(shí)現(xiàn)的方法, 沒搜到.
那就自己模擬一個(gè)吧
用了1萬個(gè)Cube
先上效果圖:
上代碼
主控制類:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Water : MonoBehaviour
{public static Water instance
;public Dictionary<string, WaterCube> dic
= new Dictionary<string, WaterCube>();void Awake(){instance
= this;CreateAllCubes();CreateDiedCubes();dic
["0:0"].SetActive();dic
["50:90"].SetActive();}void CreateAllCubes(){GameObject prefab
= Resources
.Load("Prefabs/Cube") as GameObject;for (int i
= 0; i
< 100; i
++){for (int j
= 0; j
< 100; j
++){WaterCube go
= Instantiate<WaterCube>(prefab
.GetComponent<WaterCube>(), new Vector3(i
, j
) * 2, Quaternion
.identity
);go
.i
= i
;go
.j
= j
;dic
.Add(i
.ToString() + ":" + j
.ToString(), go
);}}}void CreateDiedCubes(){for (int i
= 50; i
< 60; i
++){for (int j
= 40; j
< 80; j
++){Died(i
, j
);}}for (int i
= 20; i
< 70; i
++){for (int j
= 30; j
< 40; j
++){Died(i
, j
);}}for (int i
= 20; i
< 40; i
++){for (int j
= 60; j
< 80; j
++){Died(i
, j
);}}}void Died(int i
, int j
){string id
= (i
).ToString() + ":" + (j
).ToString();dic
[id
].isChanged
= true;dic
[id
].gameObject
.GetComponent<Renderer>().material
.color
= Color
.blue
;}
}
方塊類:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class WaterCube : MonoBehaviour
{Dictionary<string, WaterCube> dic
;public int i
;public int j
;public float speed
;float time
= 0.3f;public bool isActive
= false;public bool isChanged
= false;public void SetActive(){speed
+= 1;if (!isActive
){isActive
= true;}}void Start(){dic
= Water
.instance
.dic
;}void Update(){if (!isActive
){return;}if (!isChanged
){time
-= speed
* Time
.deltaTime
;if (time
<= 0){isChanged
= true;gameObject
.GetComponent<Renderer>().material
.color
= Color
.red
;Draw();}}}public void Draw(){string next0
= (i
- 1).ToString() + ":" + (j
).ToString();string next1
= (i
+ 1).ToString() + ":" + (j
).ToString();string next2
= (i
).ToString() + ":" + (j
- 1).ToString();string next3
= (i
).ToString() + ":" + (j
+ 1).ToString();Do(next0
);Do(next1
);Do(next2
);Do(next3
);}private void Do(string id
){if (dic
.ContainsKey(id
)){if (dic
[id
].speed
< speed
* 0.4f){dic
[id
].speed
= speed
* 0.4f;}dic
[id
].SetActive();}}
}
后面又改了一版, 使邊界更圓滑, 就是加了4個(gè)角的計(jì)算
上圖先
上代碼:
(另外記得把主控制類里的這行注釋取消: //dic[id].isChanged2 = true;//角)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class WaterCube : MonoBehaviour
{Dictionary<string, WaterCube> dic
;public int i
;public int j
;float force
= 0; float time
= 0.2f; float time2
= 0.24f; public bool isActive
= false; public bool isChanged
= false; public bool isChanged2
= false; public void SetActive(){force
+= 1;if (!isActive
){isActive
= true;}}void Start(){dic
= Water
.instance
.dic
;}void Update(){if (!isActive
){return;}if (!isChanged
){float trueSpeed
= GetTrueSpeed(force
);time
-= trueSpeed
* Time
.deltaTime
;if (time
<= 0){isChanged
= true;Draw();}}if (!isChanged2
){float trueSpeed
= GetTrueSpeed(force
);time2
-= trueSpeed
* Time
.deltaTime
;if (time2
<= 0){isChanged2
= true;Draw2();gameObject
.GetComponent<Renderer>().material
.color
= Color
.red
;}}}float GetTrueSpeed(float speed
){return 0.7f * speed
;}public void Draw(){string next0
= (i
- 1).ToString() + ":" + (j
).ToString();string next1
= (i
+ 1).ToString() + ":" + (j
).ToString();string next2
= (i
).ToString() + ":" + (j
- 1).ToString();string next3
= (i
).ToString() + ":" + (j
+ 1).ToString();Do(next0
);Do(next1
);Do(next2
);Do(next3
);}public void Draw2(){string next0
= (i
- 1).ToString() + ":" + (j
- 1).ToString();string next1
= (i
- 1).ToString() + ":" + (j
+ 1).ToString();string next2
= (i
+ 1).ToString() + ":" + (j
- 1).ToString();string next3
= (i
+ 1).ToString() + ":" + (j
+ 1).ToString();Do(next0
);Do(next1
);Do(next2
);Do(next3
);}private void Do(string id
){if (dic
.ContainsKey(id
)){dic
[id
].SetActive();}}
}
性能, 額, 以后有空再說, 沒空就這樣了, 變量名也懶得改了
數(shù)學(xué)XY函數(shù)的曲線, 可以去↓
https://zh.numberempire.com/graphingcalculator.php?functions=1.5xlog(x)-1%2F36exp(-(36x-36%2F2.7183)%5E4)&xmin=-0.501587&xmax=1.418413&ymin=-0.90833&ymax=0.371671&var=x
總結(jié)
以上是生活随笔為你收集整理的Unity漫延的实现思路(流体漫延, 火烧草地的漫延等)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。