en造数据结构与算法C# 群组行为优化 和 头鸟控制

实现:

1.给鸟类随机播放随机动画使得每一只鸟扇翅膀的频率都不尽相同

2.可以自行添加权重,并在最后 sumForce = separationForce + cohesionForce + alignmentForce;分别乘上相应权重,这样鸟就能快速飞行和转向辣

using System.Collections.Generic;
using UnityEngine;
using System.Collections;

public class BoidsCode1 : MonoBehaviour {
    Rigidbody rb;
    //鸟群存储线性表
    public List<GameObject> birdNeighbors = new List<GameObject>();

    //separation分离  alignment对齐 cohesion凝聚
    public Vector3 separationForce = Vector3.zero;
    public Vector3 alignmentForce = Vector3.zero;
    public Vector3 cohesionForce = Vector3.zero;
    //平均位置,鸟群朝向
    public Vector3 averagePosition = Vector3.zero;
    public Vector3 birdForward = Vector3.zero;
    //鸟群速度
    public Vector3 birdVelocity = Vector3.zero;
    //总力
    public Vector3 sumForce;

    //检测间隔
    public float checkInterval = 0.2f;
    //检测距离
    public float checkDistance = 2;
    //分离力最大值
    public float maxSeparationForce = 1.0f;

    private void Awake() {
        rb = GetComponent<Rigidbody>();
    }

    private void Start() {
        InvokeRepeating("CalcForce", 0, checkInterval);
    }

    //计算函数
    private void CalcForce() {
        //清空邻居鸟的列表
        birdNeighbors.Clear();
        //检测到范围内所有的鸟
        Collider[] colliders = Physics.OverlapSphere(transform.position, checkDistance);
        foreach (Collider collider in colliders) {
            if (collider != null && collider.gameObject != this.gameObject) {
                //添加到列表里面
                birdNeighbors.Add(collider.gameObject);
            }
        }

        //平均点位置为0
        averagePosition = Vector3.zero;

        //朝向设置为0
        birdForward = Vector3.zero;
        birdVelocity = Vector3.zero;

        separationForce = Vector3.zero; //分离力重设
        cohesionForce = Vector3.zero; //凝聚力重设
        alignmentForce = Vector3.zero; //对齐力重设

        foreach (GameObject bird in birdNeighbors) {
            //设定分离力的方向
            Vector3 spForceDirection = (this.transform.position - bird.transform.position);
            if (spForceDirection.magnitude > 0) {
                separationForce += spForceDirection.normalized / spForceDirection.sqrMagnitude;
            }
            //得到鸟群位置(加起来的和)
            averagePosition += bird.transform.position;
            //得到鸟群的方向和速度
            birdForward += bird.transform.forward;
            birdVelocity += bird.GetComponent<Rigidbody>().velocity;
        }

        //限制分离力的最大值
        if (separationForce.magnitude > maxSeparationForce) {
            separationForce = separationForce.normalized * maxSeparationForce;
        }

        //计算平均位置
        if (birdNeighbors.Count > 0) {
            averagePosition /= birdNeighbors.Count;
        }

        //设定凝聚力的方向
        Vector3 cohesionDirection = (averagePosition - transform.position).normalized;
        if (cohesionDirection.magnitude > 0) {
            cohesionForce += cohesionDirection;
        }

        //求取平均速度
        if (birdNeighbors.Count > 0) {
            alignmentForce = birdVelocity / birdNeighbors.Count;
        }

        施加分离力
        //rb.AddForce(separationForce, ForceMode.VelocityChange);
        施加凝聚力
        //rb.AddForce(cohesionForce, ForceMode.VelocityChange);
        施加对齐力
        //rb.AddForce(alignmentForce, ForceMode.VelocityChange);
        sumForce = separationForce + cohesionForce + alignmentForce;
     
        rb.AddForce(sumForce,ForceMode.Force);
        // 仅当当前鸟不是头鸟时,才设置朝向
        if (birdForward.magnitude > 0 && !gameObject.CompareTag("Leader")) {
            this.transform.forward = birdForward.normalized;
        }
        给予一只鸟速度平均速度
        //if (alignmentForce.magnitude > 0) {
        //    this.GetComponent<Rigidbody>().velocity = alignmentForce;
        //}
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/881303.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统编程(基础指令)上

1.Linux常见目录介绍 Linux目录为树形结构 /&#xff1a;根目录&#xff0c;一般根目录下只存放目录&#xff0c;在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”&#xff0c;你其实是在告诉电脑&#xff0c;先从/&#xff08;根目录&…

Unity3D入门(二) :Unity3D实现视角的丝滑过渡切换

1. 前言 上篇文章&#xff0c;我们已经初步了解了Unity3D&#xff0c;并新建并运行起来了一个项目&#xff0c;使相机视角自动围绕着立方体旋转。 这篇文章&#xff0c;我们来讲一下Unity3D怎么过渡地切换视角。 我们继续是我上篇文章中的项目&#xff0c;但是需要向把Camera…

​OpenAI最强模型o1系列:开启人工智能推理新时代

前不久OpenAI发布全新模型——o1模型&#xff0c;也就是业界说的“草莓模型”&#xff0c;包含三款型号&#xff1a;OpenAI o1、OpenAI o1-preview和OpenAI o1-mini。 其中&#xff0c;OpenAI o1-mini和 o1-preview已经对用户开放使用&#xff1a; OpenAI o1&#xff1a;高级推…

企业急于采用人工智能,忽视了安全强化

对主要云提供商基础设施上托管的资产的安全分析显示&#xff0c;许多公司为了急于构建和部署 AI 应用程序而打开安全漏洞。常见的发现包括对 AI 相关服务使用默认且可能不安全的设置、部署易受攻击的 AI 软件包以及不遵循安全强化指南。 这项分析由 Orca Security 的研究人员进…

Redis学习以及SpringBoot集成使用Redis

目录 一、Redis概述 二、Linux下使用Docker安装Redis 三、SpringBoot集成使用Redis 3.1 添加redis依赖 3.2 配置连接redis 3.3 实现序列化 3.4 注入RedisTemplate 3.5 测试 四、Redis数据结构 一、Redis概述 什么是redis&#xff1f; redis 是一个高性能的&#xf…

vue项目加载cdn失败解决方法

注释index.html文件中 找到vue.config.js文件注释、

【Python语言初识(二)】

一、分支结构 1.1、if语句 在Python中&#xff0c;要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的单词&#xff0c;像if和else就是专门用于构造分支结构的关键字&#xff0c;很显然你不能够使用它作为变量名&#xff08;事实上&#xff0c;用作其他…

0基础带你入门Linux之使用

1.Ubuntu软件管理 回顾一下&#xff0c;我们之前使用su root切换到root模式&#xff0c;使用who 发现为什么显示的还是bd用户呢&#xff1f;为什么呢&#xff1f; 这个who是主要来查看的是我们登录的时候是以什么用户登录的 所以即使我们使用who进行查看的时候显示的还是bd用…

【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目

之前写过一篇文章&#xff1a;《【JavaWeb】利用IntelliJ IDEA 2024.1.4 Tomcat10 搭建Java Web项目开发环境&#xff08;图文超详细&#xff09;》详细讲解了如何搭建JavaWeb项目的开发环境&#xff0c;里面默认使用的Web版本是4.0版本的。但在某些时候tomcat10可能无法运行we…

提升效率的AI工具集 - 轻松实现自动化

在这个快节奏、高效率的社会中&#xff0c;我们每个人都渴望能够找到提升工作效率的捷径。幸运的是&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;越来越多的AI工具涌现出来&#xff0c;为我们提供了强大的支持。这些工具不仅能够帮助我们提高…

计算机毕业设计 美发管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

尚品汇-秒杀成功下单接口、秒杀结束定时任务-清空缓存数据(五十四)

目录&#xff1a; &#xff08;1&#xff09;下单页面 &#xff08;2&#xff09;service-activity-client添加接口 &#xff08;3&#xff09;web-all 编写去下单控制器 &#xff08;4&#xff09;service-order模块提供秒杀下单接口 &#xff08;5&#xff09;service-or…

安全基础学习-AES128加密算法

前言 AES&#xff08;Advanced Encryption Standard&#xff09;是对称加密算法的一个标准&#xff0c;主要用于保护电子数据的安全。AES 支持128、192、和256位密钥长度&#xff0c;其中AES-128是最常用的一种&#xff0c;它使用128位&#xff08;16字节&#xff09;的密钥进…

推荐系统-电商直播 多目标排序算法探秘

前言&#xff1a; 电商直播已经成为电商平台流量的主要入口&#xff0c;今天我们一起探讨推荐算法在直播中所面临的核心问题和解决方案。以下内容参考阿里1688的技术方案整理完成。 一、核心问题介绍 在电商网站中&#xff0c;用户的主要行为是在商品上的行为&#xff0c;直播…

机器学习笔记(一)初识机器学习

1.定义 机器学习是一门多学科交叉专业&#xff0c;涵盖概率论知识&#xff0c;统计学知识&#xff0c;近似理论知识和复杂算法知识&#xff0c;使用计算机作为工具并致力于真实实时的模拟人类学习方式&#xff0c;并将现有内容进行知识结构划分来有效提高学习效率。 机器学习有…

JUC学习笔记(三)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 八、共享模型之工具--JUC8.1 AQS 原理1. 概述2 实现不可重入锁自定义同步器自定义锁 3.心得起源目标设计1) state 设计2&#xff09;阻塞恢复设计3&#xff09;队列…

Stable Diffusion不同部件拆分详解

看到很多文章对Stable Diffusion各种原理、详解等&#xff0c;但是么有看到有文章细拆里面各个子模块在做啥&#xff0c;怎么做的&#xff0c;所以就会遇到整体原理理解很透传&#xff0c;问到细节就卡住&#xff0c;这段时间细看了一下文章&#xff0c;对各个部分做一个拆解详…

网络基础,协议,OSI分层,TCP/IP模型

网络的产生是数据交流的必然趋势&#xff0c;计算机之间的独立的个体&#xff0c;想要进行数据交互&#xff0c;一开始是使用磁盘进行数据拷贝&#xff0c;可是这样的数据拷贝效率很低&#xff0c;于是网络交互便出现了&#xff1b; 1.网络是什么 网络&#xff0c;顾名思义是…

【SQL Server】清除日志文件ERRORLOG、tempdb.mdf

数据库再使用一段时间后&#xff0c;日志文件会增大&#xff0c;特别是在磁盘容量不足的情况下&#xff0c;更是需要缩减&#xff0c;以下为缩减方法&#xff1a; 如果可以停止 SQL Server 服务&#xff0c;那么可以采取更直接的方式来缩减 ERRORLOG 和 tempdb.mdf 文件的大小…

【IoTDB 线上小课 07】多类写入接口,快速易懂的“说明书”!

【IoTDB 视频小课】稳定更新中&#xff01;第七期来啦~ 关于 IoTDB&#xff0c;关于物联网&#xff0c;关于时序数据库&#xff0c;关于开源... 一个问题重点&#xff0c;3-5 分钟&#xff0c;我们讲给你听&#xff1a; 一条视频了解写入接口 了解我们的友友们&#xff0c;应该…