版权申明:

  • 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
  • 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

目标

  • 鱼的摆动
  • 鱼群的摆动
  • 鱼群的直行
  • 鱼群的游动及旋转
  • 鱼群被目标体影响方向

鱼的摆动

首先导入鱼的资源包,

点击Import导入(可能有点慢)


选取一条鱼拖入场景中

现在鱼是静止的,我们要让鱼的身体摆动起来:
把鱼的动画swim拖进Animator的Controller中,此时会自动出现一个控制器,我们把它取名为FishCtrl,

双击控制器FishCtrl,双击swim,为了使鱼的身体一直摆动,我们要勾上Looptime:

此时我们来运行一下,鱼已经可以摆动身体了:

鱼群的摆动

首先创建一Empty game object取名为Fishmanager,然后创建一个 Scripe取名为globolFlock,并把脚本拖给Fishmanager且打开脚本编写如下的代码:

using System.Collections;
using System.Collections.Generic;
public class globolFlock : MonoBehaviour {public GameObject fishPrefab;public static int tankSize = 5;static int numFish = 10;public static GameObject[] allFish = new GameObject[numFish];// Use this for initializationvoid Start () {for (int i = 0; i < numFish; i++){Vector3 pos = new Vector3(Random.Range(-tankSize, tankSize),Random.Range(-tankSize, tankSize),Random.Range(-tankSize, tankSize));allFish[i] = (GameObject)Instantiate(fishPrefab, pos, Quaternion.identity);}}// Update is called once per framevoid Update(){}
}

把之前拖进来的鱼拖到Assets里面,把之前拖进来的鱼delect掉,因为我们不再需要它。再把鱼拖到Fish Prefab处。

此时运行:

鱼群的直行

创建一个Script取名为flock,并把脚本拖给 fish且打开脚本编写如下的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class flock : MonoBehaviour {public float speed = 0.1f;// Use this for initializationvoid Start () {speed = Random.Range(0.5f, 1);}// Update is called once per framevoid Update () {transform.Translate(0, 0, Time.deltaTime * speed);transform.Translate(0, 0, Time.deltaTime * speed);}
}


此时运行,小鱼能直行了:

鱼群的游动及旋转

首先打开我们的globolFlock脚本并把代码更改为以下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class globolFlock : MonoBehaviour {public GameObject fishPrefab;public static int tankSize = 5;static int numFish = 10;public static GameObject[] allFish = new GameObject[numFish];public static Vector3 goalPos = Vector3.zero;// Use this for initializationvoid Start () {for (int i = 0; i < numFish; i++){Vector3 pos = new Vector3(Random.Range(-tankSize, tankSize),Random.Range(-tankSize, tankSize),Random.Range(-tankSize, tankSize));allFish[i] = (GameObject)Instantiate(fishPrefab, pos, Quaternion.identity);}}// Update is called once per framevoid Update(){if (Random.Range(0, 10000) < 50){goalPos = new Vector3(Random.Range(-tankSize, tankSize),Random.Range(-tankSize, tankSize),Random.Range(-tankSize, tankSize));    }}
}

再打开我们的flock脚本并把代码更改为以下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class flock : MonoBehaviour
{public float speed = 0.0001f;float rotationSpeed = 4.0f;Vector3 averageHeading;Vector3 averagePosition;float neighbourDistance = 3.0f;bool turning = false;// Use this for initializationvoid Start(){speed = Random.Range(0.5f, 1);}// Update is called once per framevoid Update(){if (Vector3.Distance(transform.position, Vector3.zero) >= globolFlock.tankSize){turning = true;}elseturning = false;if (turning){Vector3 direction = Vector3.zero - transform.position;transform.rotation = Quaternion.Slerp(transform.rotation,Quaternion.LookRotation(direction),rotationSpeed * Time.deltaTime);speed = Random.Range(0.5f, 1);}else{if (Random.Range(0, 5) < 1)ApplyRules();}transform.Translate(0, 0, Time.deltaTime * speed);}void ApplyRules(){GameObject[] gos;gos = globolFlock.allFish;Vector3 vcentre = Vector3.zero;Vector3 vavoid = Vector3.zero;float gSpeed = 0.1f;Vector3 goalPos = globolFlock.goalPos;float dist;int groupSize = 0;foreach (GameObject go in gos){if (go != this.gameObject){dist = Vector3.Distance(go.transform.position, this.transform.position);if (dist <= neighbourDistance){vcentre += go.transform.position;groupSize++;if (dist < 1.0f){vavoid = vavoid + (this.transform.position - go.transform.position);}flock anothrtFlock = go.GetComponent<flock>();gSpeed = gSpeed + anothrtFlock.speed;}}}if (groupSize > 0){vcentre = vcentre / groupSize + (goalPos - this.transform.position);speed = gSpeed / groupSize;Vector3 direction = (vcentre + vavoid) - transform.position;if (direction != Vector3.zero)transform.rotation = Quaternion.Slerp(transform.rotation,Quaternion.LookRotation(direction),rotationSpeed * Time.deltaTime);}}
}

此时运行,鱼群可以游动及旋转了:

鱼群被目标影响方向

首先还是先打开我们的globolFlock脚本然后添加以下的代码:

public GameObject goalPrefab;
void Update(){if (Random.Range(0, 10000) < 50){goalPos = new Vector3(Random.Range(-tankSize, tankSize),Random.Range(-tankSize, tankSize),Random.Range(-tankSize, tankSize));goalPrefab.transform.position = goalPos;}}

现在我们创建一个Sphere,把它修改成适当尺寸并放入恰当位置,然后把Sphere拖到globolFlock的Goal Prefab里,

  • 保存后运行游戏即可看到我们的鱼群朝着目标体游动且被目标体影响游动方向的效果了。

在unity中如何实现群体行为模拟步骤详解相关推荐

  1. java jdbc连接 代码块_java 中JDBC连接数据库代码和步骤详解及实例代码

    •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的 ...

  2. Unity中精灵Sprite,精灵图集SpriteAtlas详解

    前言 Unity3D中UGUI的Image组件.Unity2D的SpriteRender组件等都需要使用Sprite类型的图片. 用户在导入图片资源后,可以切换TextureType为Sprite(2 ...

  3. ruby中DBI连接MySQL数据库步骤详解

    2019独角兽企业重金招聘Python工程师标准>>> 1.准备工作. 首先下载DBI接口:http://rubyforge.org/frs/download.php/12368/d ...

  4. Unity中使用模板测试模拟Mask组件效果

    本文分享Unity中使用模板测试模拟Mask组件效果 在上一篇文章中, 我们分享了模板测试的基础知识, 在今天的分享中, 我们会尝试使用模板测试来模拟遮罩效果. Unity中使用模板测试模拟Mask组 ...

  5. 加载vue文件步骤_vue中.vue文件解析步骤详解

    这次给大家带来vue中.vue文件解析步骤详解,vue中.vue文件解析的注意事项有哪些,下面就是实战案例,一起来看一下. 我们平时写的 .vue 文件称为 SFC(Single File Compo ...

  6. java实现for文件删除_Java 添加、删除、替换、格式化Word中的文本的步骤详解(基于Spire.Cloud.SDK for Java)...

    Spire.Cloud.SDK for Java提供了TextRangesApi接口可通过addTextRange()添加文本.deleteTextRange()删除文本.updateTextRang ...

  7. java none怎么用tomcat_在docker中部署tomcat并且部署java应用程序的步骤详解

    先给大家简单说下Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是 ...

  8. python波形图librosa_对python中Librosa的mfcc步骤详解

    对python中Librosa的mfcc步骤详解 发布时间:2020-10-18 23:55:35 来源:脚本之家 阅读:71 作者:qq_39239990 1.对语音数据归一化 如16000hz的数 ...

  9. vue中如何调用ios摄像头_vue2.0调用摄像头步骤详解

    这次给大家带来vue2.0调用摄像头步骤详解,使用vue2.0调用摄像头的注意事项有哪些,下面就是实战案例,一起来看一下. 可以在github 上下载demo链接 vue组件代码 import {Ex ...

最新文章

  1. 三种字符编码:ASCII、Unicode和UTF-8
  2. TabHost 两种使用方法 直接让一个Activity 继承TabActivity 和 利用findViwById()方法取得TagHost组件...
  3. 协方差矩阵的概念,算法以及自己的一些理解
  4. (数据结构与算法)使用栈来实现综合计算器
  5. ERA5 积雪 降雪 区别_面对大雪吧~2020陕西首场,以下区域积雪将达20厘米
  6. 苹果要做第一个吃螃蟹的人!将率先尝试台积电5nm工艺
  7. Ubuntu系统下Git的使用
  8. mysql8导入不同schme_新特性解读 | MySQL 8.0.22 任意格式数据导入
  9. oracle生成测试数据的简单方法
  10. 解决phpcms V9 推荐位无法排序
  11. 什么是SIT, UAT测试
  12. 串级控制系统matlab仿真,锅炉串级三冲量给水控制系统的MATLAB 仿真
  13. python爬虫十二:初步使用Scrapy框架爬取数据
  14. uniapp微信浏览器H5授权微信登录
  15. 解决 rsync: failed to connect to xxx.xxx.xxx.85 (xxx.xxx.xxx.85): No route to host (113) 问题
  16. 图像基本操作——图像边界填充和图像融合
  17. yii2 如何用命名空间方式使用第三方类库
  18. 用懊悔法学习吴恩达机器学习【1】
  19. java 获取浏览器名称及版本号
  20. 领导给下属写周报,我看行

热门文章

  1. K2P在DYNV6自动更新外网IP地址的脚本
  2. 中国成语测试软件,中国汉字水平测试
  3. 解决U盘文件变成快捷方式的最佳方法
  4. intellij idea处理xml文件File encoding is disabled,Encoding is hard-coded in the text.提示的方法
  5. Docker容器之Consul部署
  6. 考研词汇 用语言记忆
  7. 加密解密技术基础及用OpenSSL创建私有CA
  8. ThinkPad T480 Win10系统键盘失灵
  9. 深度学习环境搭建第一步----Ubuntu 安装(win7 + win10)
  10. 通过Web Service实现IP地址查询功能