UnityAI——操控行为编程的主要基类

2023-10-31 00:52

本文主要是介绍UnityAI——操控行为编程的主要基类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文内容位于AI模型中的运动层。变成种主要涉及到Vehicle、AILocomotion和Steering类,它们是实现操控行为的基础

一、将AI对象抽象成一个质点——Vehicle类

Vehicle包括position、mass、velocity等信息,而速度随着所施加力的变化而变化。由于是物理实体,因此还要加上max_force和max_speed两个信息

Velocity的位置的计算方法如下:

  1. 确定每一帧的操控力(不得超过max_force)
  2. 除以mass,得到加速度
  3. 将加速度与原速度相加(不得超过max_speed)
  4. 根据速度和这一帧的时间,得到位置的变化
  5. 与原位置相加,得到新位置

在这个模型中,来自控制行为部分的控制信号只是一个向量——steering_force。当然也可以用更复杂的模型,本文不介绍。

在下面这个实现中,Vehicle是一个基类,其他所有可以动的游戏AI角色都由它派生而来。该实现封装了一些数据,用来描述被看作质点的"交通工具"。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Vehicle : MonoBehaviour
{private Steering[] steerings;//这个AI包含的操控行为列表public float maxSpeed = 10;public float maxForce = 100;    //能施加到这个角色身上的力的最大值public float sqrMaxSpeed;public float mass = 1;public Vector3 velocity;     public float damping= 0.9f    //转向时的速度public float computeInterval = 0.2f; //操控力的计算时间间隔,为了达到更高的帧率,操控力不需要每帧更新public bool isPlanar = true;   //是否在二维平面上,如果是,计算两个物体距离时,忽略y值的不同private Vector3 steeringForce;private Vector3 acceleration;private float timer;  //计时器void Start(){steeringForce = new Vector3(0, 0, 0);sqrMaxSpeed=maxSpeed*maxSpeed;timer = 0;steerings = GetComponent<Steering>();}// Update is called once per framevoid Update(){timer += timer.deltaTime;steeringForce = new Vector3(0, 0, 0);if(timer>computeInterval){//将操控性为列表中的所有行为对应的操控力进行带权重的求和foreach(Steering s in steerings){if (s.enabled)steeringForce += s.Force() * s.weight;}steeringForce = Vector3.ClampMagnitude(steeringForce, maxForce);acceleration = steeringForce / mass;timer = 0;}}
}

二、控制AI角色移动——AILocomotion

AILocomotion类是Vehicle的派生类,它能真正控制AI角色的移动,包括计算每次移动的距离,播放动画等,下面是一个示例实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AILocomotion : Vehicle
{private CharacterController controller;  //AI的角色控制器private Rigidbody theRigidbody;private Vector3 moveDistance;//AI角色每次的移动距离void Start(){controller = GetComponent<CharacterController>();theRigidbody = GetComponent<Rigidbody>();moveDistance = new Vector3(0, 0, 0);base.Start();//调用基类的start函数,进行所需的初始化}//物理相关操作在FixedUpdate中更新void FixedUpdate(){velocity += acceleration * Time.fixedDelataTime;//计算速度if (velocity.sqrMagnitude > sqrMaxSpeed)   //限制最大速度velocity = velocity.normalized * maxSpeed;moveDistance = velocity * Time.fixedDeltaTime;if (isPlanar)  {velocity.y = 0;moveDistance.y = 0;}if (controller != null)//如果已经为AI角色添加角色控制器,那么利用角色控制器使其移动controller.SimpleMove(velocity);//如果角色既没角色控制器,也没Rigidbody//或有Rigidbody,但要由动力学的方式控制其移动else if (theRigidbody == null || !theRigidbody.isKinematic)transform.position += moveDistance;else //用Rigidbody控制角色的运动theRigidbody.MovePosition(theRigidbody.position+moveDistance);if(velocity.sqrMagnitude>0.00001)//更新朝向,如果速度大于一个阈值(为了防止抖动){Vector3 newForward = Vector3.Slerp(transform.forward, velocity, damping * Time.deltaTime);if(isPlanar)newForward.y = 0;transform.forward = newForward;}//播放行走动画gameObject.animation.Play("walk");}
}

三、各种操控性味的基类——Steering类

Steering类是所有操控行为的基类,包括操控行为共有的变量和方法,操控AI角色的寻找、逃跑、追逐、躲避、徘徊、分离、队列、聚集等都可由此派生。这样,我们就可以在C#脚本中方便地使用上述派生类来编程了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Steering : MonoBehaviour
{public float weight = 1;void Start(){}// Update is called once per framevoid Update(){}public virtual Vector3 Force(){return new Vector3(0, 0, 0);}
}

这篇关于UnityAI——操控行为编程的主要基类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311698

相关文章

便携式气象仪器的主要特点

TH-BQX9】便携式气象仪器,也称为便携式气象仪或便携式自动气象站,是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。以下是关于便携式气象仪器的详细介绍:   主要特点   高精度与多功能:便携式气象仪器能够采集多种气象参数,包括但不限于风速、风向、温度、湿度、气压等,部分高级型号还能监测雨量和辐射等。数据采集与存储:配备微电脑气象数据采集仪,具有实时时钟、数据存

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空

分布式系统的主要考虑

异构性:分布式系统由于基于不同的网路、操作系统、计算机硬件和编程语言来构造,必须要考虑一种通用的网络通讯协议来屏蔽异构系统之间的禅意。一般交由中间件来处理这些差异。缺乏全球时钟:在程序需要协作时,它们通过交换消息来协调它们的动作。紧密的协调经常依赖于对程序动作发生时间的共识,但是,实际上网络上计算机同步时钟的准确性受到极大的限制,即没有一个正确时间的全局概念。这是通过网络发送消息作为唯一的通信方式