日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity漫延的实现思路(流体漫延, 火烧草地的漫延等)

發布時間:2023/12/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity漫延的实现思路(流体漫延, 火烧草地的漫延等) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

↓首先這是Unity出了個Bug, 顏色混亂了

白色區域開始漫延, 當它遇到白球的時候, 會向兩邊分叉漫延.
這就很神奇.
顏色也會有碰撞嗎?

我想實現這種效果, 于是去網上搜實現的方法, 沒搜到.
那就自己模擬一個吧
用了1萬個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].isChanged2 = 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個角的計算
上圖先

上代碼:
(另外記得把主控制類里的這行注釋取消: //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();//gameObject.GetComponent<Renderer>().material.color = Color.red;}}//被激活后, 開始轉變, 角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 -2 / speed + 3;return 0.7f * speed;}//4個邊相鄰的方塊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);}//4個角相鄰的方塊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();}} }

性能, 額, 以后有空再說, 沒空就這樣了, 變量名也懶得改了


數學XY函數的曲線, 可以去↓
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

總結

以上是生活随笔為你收集整理的Unity漫延的实现思路(流体漫延, 火烧草地的漫延等)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。