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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Unity中实现群组行为

發布時間:2024/3/12 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity中实现群组行为 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:效果演示

不使用群組算法和使用群組算法的演示視頻


二:什么是群組行為

群組行為屬于人工智能思想,比如說人群走路、鳥群飛行、魚群游動,群組中成員之間不應該很規律的運動,例如不能擁擠到一起,而是更加真實的去模擬現實中的場景
下面是不使用群組行為和使用群組行為的演示

群組中的三種行為:
——分隔:成員間保持一定距離,不能太近
——隊列:群組以相同的速度向相同方向運動
——聚集:避免與臨近成員距離太遠


三:群組行為中的三種行為

為了更好的模擬現實環境,使用施加力的方式替代直接修改物體速度,因為直接修改物體的速度會無視各種外力,而施加力是一種仿物理的方式

——分隔

當成員之間相距很近時,給其一個相反的力進行分離

——隊列

當與大部隊運動方向不一致時,給其一個力進行調整

——聚集

當與其他成員相距很遠時,就選取就近幾個成員的中心點,施加力實現聚集


四:代碼實現

using UnityEngine;/// <summary> /// 群組行為中的個體 /// </summary> public class UnityFlock : MonoBehaviour {public Transform target;//目標物體[Header("運動速度")]public float speed;[Header("物體質量")]private int m = 1;[Header("需要分離的距離")][Header("====================")]public float separationDist;[Header("分離力的比重")]public float separationWeight;[Header("需要隊列的距離")]public float alignmentDist;[Header("隊列力的比重")]public float alignmentWeight;[Header("需要聚集的距離")]public float cohesionDist;[Header("聚集力的比重")]public float cohesionWeight;private Vector3 velocity;//速度private void Awake(){velocity = Vector3.forward;}private void Update(){Vector3 sumForce = Vector3.zero;sumForce += Separation() * separationWeight;sumForce += Alignment() * alignmentWeight;sumForce += Cohesion() * cohesionWeight;sumForce += Seek() * speed;Vector3 a = sumForce / m;velocity += a * Time.deltaTime;transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(velocity), 0.2f);transform.Translate(transform.forward * Time.deltaTime, Space.World);}/// <summary>/// 尋找目標/// </summary>/// <returns></returns>private Vector3 Seek(){Vector3 force = Vector3.zero;Vector3 dir = target.position - transform.position;force = dir.normalized - transform.forward;return force;}/// <summary>/// 得到分離的力/// </summary>private Vector3 Separation(){Vector3 separationForce = Vector3.zero;GameObject[] objs = GameObject.FindGameObjectsWithTag("UnityFlock");foreach (var unity in objs){if (unity == gameObject){continue;}if (Vector3.Distance(transform.position, unity.transform.position) <= separationDist){Vector3 dir = transform.position - unity.transform.position;separationForce += dir.normalized / dir.magnitude;}}return separationForce;}/// <summary>/// 得到隊列的力/// </summary>private Vector3 Alignment(){Vector3 alignmentForce = Vector3.zero;GameObject[] objs = GameObject.FindGameObjectsWithTag("UnityFlock");Vector3 avgDir = Vector3.zero;int counter = 0;foreach (var unity in objs){if (unity == gameObject){continue;}if (Vector3.Distance(transform.position, unity.transform.position) < alignmentDist){counter++;avgDir += unity.transform.forward;}}avgDir /= counter;alignmentForce += (avgDir - transform.forward).normalized;return alignmentForce;}/// <summary>/// 聚集/// </summary>private Vector3 Cohesion(){Vector3 cohesionForce = Vector3.zero;GameObject[] objs = GameObject.FindGameObjectsWithTag("UnityFlock");Vector3 avgDir = Vector3.zero;int counter = 0;foreach (var unity in objs){if (unity == gameObject){continue;}if (Vector3.Distance(transform.position, unity.transform.position) < alignmentDist){counter++;avgDir += unity.transform.position;}}avgDir /= counter;cohesionForce += (avgDir - transform.position).normalized;return cohesionForce;} }

總結

以上是生活随笔為你收集整理的Unity中实现群组行为的全部內容,希望文章能夠幫你解決所遇到的問題。

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