1. using System.Collections.Generic;
  2. using UnityEngine;
  3.  
  4. public class CrowAI : MonoBehaviour {
  5. //当前速度
  6. public float speed = ;
  7. public Vector3 velocity = Vector3.forward;
  8. private Vector3 startVelocity;//初始化当前速度
  9. public Transform target;//目标点
  10. //总力
  11. public Vector3 sumForce = Vector3.zero;
  12. //质量
  13. public float m = ;
  14.  
  15. //分离的力
  16. public float sparationDistance = ; //分离的距离
  17. public List<GameObject> sparationNeighbors = new List<GameObject>();
  18. public float sparationWeight = ; //权重
  19. public Vector3 sparationForce = Vector3.zero;
  20.  
  21. //队列的力
  22. public float alignmentDistance = ;
  23. public List<GameObject> alignmentNeighbors = new List<GameObject>();
  24. public float alignmentWeight = ; //权重
  25. public Vector3 alignmentForce = Vector3.zero;
  26.  
  27. //聚集的力
  28. public float cohesionWeight = ;//权重
  29. public Vector3 cohesionForce = Vector3.zero;
  30. //间隔几秒检测一次
  31. public float checkInterval = 0.2f;
  32.  
  33. private Animation anim;
  34. public float animRandom = ;
  35. void Start()
  36. {
  37. target = GameObject.Find("target").transform;
  38. startVelocity = velocity;
  39. //0 秒后调用 CalcForce() 方法,并且之后每隔 checkInterval 秒调用一次 CalcForce() 方法
  40. InvokeRepeating("CalcForce", , checkInterval);
  41. anim = GetComponentInChildren<Animation>();
  42. Invoke("Playanim", Random.Range(, animRandom));
  43. }
  44. void Playanim() {
  45. anim.Play();
  46. }
  47.  
  48. void CalcForce() {
  49. //计算之前先归零
  50. sumForce = Vector3.zero;
  51. sparationForce = Vector3.zero;
  52. alignmentForce = Vector3.zero;
  53. cohesionForce = Vector3.zero;
  54.  
  55. //先清空集合
  56. sparationNeighbors.Clear();
  57. Collider[] colliders = Physics.OverlapSphere(transform.position, sparationDistance);
  58. foreach (Collider c in colliders)
  59. {
  60. //判断该物体近的邻居
  61. if (c!=null && c.gameObject!=this.gameObject)
  62. {
  63. sparationNeighbors.Add(c.gameObject);
  64. }
  65. }
  66.  
  67. //1.计算分离的力
  68. foreach (GameObject neighbor in sparationNeighbors)
  69. {
  70. Vector3 dir = transform.position - neighbor.transform.position;
  71. sparationForce += dir.normalized / dir.magnitude;
  72. }
  73. //如果附近有物体
  74. if (sparationNeighbors.Count > )
  75. {
  76. //得到分离的力
  77. sparationForce *= sparationWeight;
  78. //得到的力赋值给总力
  79. sumForce += sparationForce;
  80. }
  81.  
  82. //2.计算队列的力(整体一个前进的力)
  83. alignmentNeighbors.Clear();
  84. colliders = Physics.OverlapSphere(transform.position, alignmentDistance);
  85. foreach (Collider c in colliders)
  86. {
  87. if (c!=null &&c.gameObject !=this.gameObject)
  88. {
  89. alignmentNeighbors.Add(c.gameObject);
  90. }
  91. }
  92. //计算邻居的平均朝向
  93. Vector3 avgDir = Vector3.zero;
  94. //朝向的总和
  95. foreach (GameObject n in alignmentNeighbors)
  96. {
  97. avgDir += n.transform.forward;
  98. }
  99. if (alignmentNeighbors.Count >)
  100. {
  101. //得到平均数
  102. avgDir /= alignmentNeighbors.Count;
  103. //得到相对方向
  104. alignmentForce = avgDir = transform.forward;
  105. alignmentForce *= alignmentWeight;
  106. //得到的力赋值给总力
  107. sumForce += alignmentForce;
  108. }
  109.  
  110. //3.聚集的力
  111. if (alignmentNeighbors.Count > )
  112. {
  113. Vector3 center = Vector3.zero;
  114. foreach (GameObject n in alignmentNeighbors)
  115. {
  116. center += n.transform.position;
  117. }
  118. center /= alignmentNeighbors.Count;
  119. Vector3 dirToCenter = center - transform.position;
  120. cohesionForce += dirToCenter.normalized * velocity.magnitude;
  121. cohesionForce *= cohesionWeight;
  122. sumForce += cohesionForce;
  123. }
  124.  
  125. //4.保持恒定飞行速度的力
  126. Vector3 enginForce = velocity.normalized * startVelocity.magnitude;
  127. sumForce += enginForce * 0.1f;
  128. //4.保持恒定目标飞行的效果
  129. Vector3 targetDir = target.position - transform.position;
  130. sumForce += (targetDir.normalized - transform.forward)*speed;
  131. }
  132.  
  133. void Update () {
  134. //加速度(根据牛顿第二定律)
  135. Vector3 a = sumForce / m;
  136. //计算出速度
  137. velocity += a * Time.deltaTime;
  138. //物体运行
  139. transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(velocity), Time.deltaTime*);
  140. transform.Translate(transform.forward * Time.deltaTime * velocity .magnitude, Space.World);
  141. }
  142. }

AI_群组行为的更多相关文章

  1. 微信小程序的机会在于重新理解群组与二维码

    历时一年,唯一一个尚未发布就获得Pony Ma与Allen Zhang站台的产品:微信小程序,将于2017年1月9日正式上线了.我很期待.唯一要警惕的是:防止长考出臭棋. 在上线前夕,我对于如何借助小 ...

  2. 一行实现QQ群组头像,微信群组,圆角等效果. 并支持url直接加载图片

    说点题外话. Coding中我们总是经历着这么几个过程. 学会使用: 不管是API也好, 开源库也好. 总是在最开始的学会去用. 了解实现原理: 可能会因为一些不兼容, 代码的异常状态的处理不够完美等 ...

  3. 添加群组表AppGroup和群组详细表AppGroupDetails

    添加群组表AppGroup和群组详细表AppGroupDetails CREATE TABLE [dbo].[AppGroup]( ) NOT NULL PRIMARY KEY, ) NOT NULL ...

  4. linux基础-第七单元 用户、群组及权限的深入讨论

    怎样查看文件的权限 ls命令详解 root用户及文件的安全控制 什么是root用户 用户分类 文件操作权限 文件操作权限的字符表示 chown chgrp 使用符号表示法设定文件或目录上的权限 chm ...

  5. linux基础-第六单元 用户、群组和权限

    用户及passwd文件 /etc/passwd文件的功能 /etc/passwd文件每个字段的具体含义 shadow文件 /etc/shadow文件的功能 /etc/shadow文件每个字段的具体含义 ...

  6. linux命令之 用户和群组

    一.保存用户信息的文件 1 /etc/passwd root:x:::root:/root:/bin/bash pwftp:x::::/alidata/www/wwwroot/:/sbin/nolog ...

  7. Linux系统之用户、群组和权限

    一.用户管理 创建用户时,系统为用户分配一个唯一的编号UID,同时为用户创建一个同名的组,并为组分配一个编号GID,并把该用户加入该组中. 系统规定: uid: 0       特权用户      u ...

  8. #Linux学习笔记# Linux文件的所有者、群组和其他人

    1.关于所有者.群组和其他人 在Linux系统中,每个文件都具有User.Group和Others三种身份的权限配置.那这三种身份分别表示什么意思呢?配置这三种身份的权限有啥意义呢? (1)文件所有者 ...

  9. Linux 的账号与群组[转自vbird]

    Linux 的账号与群组 管理员的工作中,相当重要的一环就是『管理账号』啦!因为整个系统都是你在管理的, 并且所有一般用户的账号申请,都必须要透过你的协助才行!所以你就必须要了解一下如何管理好一个服务 ...

随机推荐

  1. [emacs] emacs调整C代码的缩进格式等

    相比于VIM,emacs在默认配置下写C代码还真是不好用. 好多东西都要调整,其中最麻烦的就是缩进.调啊调,调了好久. 勉强形成一个配置如下: (add-hook 'c-mode-hook (lamb ...

  2. SharePoint列表模板(.stp)

    背景:在sharepoint中,我们经常使用SharePoint Designer定制列表的新建.编辑.查看页面,当我们在开发环境定制好了的时候,怎么才能将定制的列表移到正式环境.        实现 ...

  3. IntelliJ IDEA 指定Java编译版本

    在IntelliJ IDEA 15中使用Maven时,IDEA将默认的编译版本.源码版本设置为jdk5.编译项目的时候出现警告:”Warning:Java: 源值1.5已过时, 将在未来所有发行版中删 ...

  4. allegro17.2 gerber 步骤

    1.Manufacture -> NC -> Drill Customization... 先点击 Auto generate symbols,出来对话框后点击 YES .然后在Symbo ...

  5. ESP8266小知识与注意事项

    小知识 1. 什么是"512+512".“1024+1024”? 当ESP8266支持FOTA(无线升级)时,会给系统做个备份,当升级失败时,使之不至于死机.所以flash会被分割 ...

  6. 跨平台技术实践案例: 用 reactxp 重写墨刀的移动端

    Authors:  Gao Cong, Perry Poon Illustrators:  Shena Bian April 20, 2019 重新编写,又一次,我们又一次重新编写了移动端应用和移动端 ...

  7. spring boot入门小案例

    spring boot 入门小案例搭建 (1) 在Eclipse中新建一个maven project项目,目录结构如下所示: cn.com.rxyb中存放spring boot的启动类,applica ...

  8. 将文件转成clob添加到Oracle数据库中

    Controller层: @Controller@RequestMapping(value = {"/Test/TestController"})public class Test ...

  9. MongoDB在Windows系统下的安装和启动

    版本选择MongoDB的版本命名规范如:x.y.z: y为奇数时表示当前版本为开发版,如:2.3.0.2.1.1: y为偶数时表示当前版本为稳定版,如:2.0.1.2.2.0: 目前官网上最新的版本为 ...

  10. 关于git的认证方式

    之前对github的使用,形成了两种观点.就是有两种url的模式,一种是http或https的,另一种是git专属的.然后git专属的url方式可以配置公钥认证,http(s)的则需要输入密码. 近期 ...