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

简介: 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;
    protected Vector3 acceleration;
    private float timer;  //计时器
    protected void Start()
    {
        steeringForce = new Vector3(0, 0, 0);
        sqrMaxSpeed=maxSpeed*maxSpeed;
        timer = 0;
        steerings = GetComponents<Steering>();
    }
    // Update is called once per frame
    void Update()
    {
        timer += Time.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.fixedDeltaTime;//计算速度
        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 frame
    void Update()
    {
    }
    public virtual Vector3 Force()
    {
        return new Vector3(0, 0, 0);
    }
}


相关文章
|
Swift iOS开发 Ruby
iOS CocoaPods 使用以及常见问题(上)
iOS CocoaPods 使用以及常见问题
771 0
|
5月前
|
C# 图形学 开发者
【Unity3D实例-功能-镜头】第三人称视觉
本文介绍了Unity中常用的第三人称视角实现方法,适用于角色扮演游戏。内容包括安装Cinemachine插件、为角色添加面朝向点、创建虚拟摄像机、编写控制脚本及测试运行,帮助开发者快速掌握镜头控制技巧。
200 0
|
9月前
|
搜索推荐 数据挖掘 API
深入研究:京东图片搜索商品API详解
京东图片搜索商品API简介:在电商快速发展的背景下,用户需求日益多样化。为提升购物体验,京东推出图片搜索商品API,通过上传商品图片(如实物图或宣传图),利用图像识别技术匹配京东商品库,返回相似商品的信息(如名称、价格、销量等)。该API采用HTTP POST请求方式,支持JPEG、PNG等常见图片格式,并可设置分类范围和结果数量限制等可选参数,助力开发者实现更精准的商品搜索,优化用户体验,同时为数据分析与个性化推荐提供支持。本文详细介绍了其功能、使用方法及Python请求示例。
|
存储 安全 Unix
网络文件系统 (NFS)
【10月更文挑战第12天】
541 5
|
定位技术 C# 图形学
从零开始的unity3d入门教程(二)----基本功能讲解
这是一篇Unity3D入门教程,详细介绍了Unity界面操作、游戏物体创建修改、场景搭建、玩家控制、音效添加以及游戏测试和导出的全过程。
从零开始的unity3d入门教程(二)----基本功能讲解
|
11月前
|
云安全 运维 安全
阿里云免费版SSL证书申请及部署图文教程指导
SSL证书是个人和企业搭建网站不可或缺的云安全产品,SSL证书能够为网站和移动应用(APP)及小程序提供数据HTTPS加密协议访问,保障数据的安全。阿里云SSL证书有收费版的也有免费版的,有的新手用户由于是初次在阿里云申请SSL证书,可能不是很清楚免费版证书的申请和部署流程,本文为以图文形式为大家展示阿里云免费版SSL证书最新的申请及部署教程,以供参考。
|
数据采集 人工智能 自然语言处理
中科大联合华为诺亚提出Entropy Law,揭秘大模型性能、数据压缩率以及训练损失关系
【8月更文挑战第14天】中科大与华为联合提出的Entropy Law理论,揭示了大语言模型性能与数据压缩率及训练损失的关系,指出低压缩率和高数据一致性有利于提升模型效能。基于此,开发出ZIP数据选择算法,通过多阶段贪婪策略优选低冗余样本,有效提高了模型训练效率和性能,同时降低了计算成本。这一成果为优化大模型训练提供了新途径。论文详述请见链接:https://arxiv.org/pdf/2407.06645。
360 65
|
图形学 数据安全/隐私保护 iOS开发
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
|
机器学习/深度学习 存储 人工智能
政务部门人工智能OCR智能化升级:3大技术架构与4项核心功能解析
本项目针对政务服务数字化需求,建设智能文档处理平台,利用OCR、信息抽取和深度学习技术,实现文件自动解析、分类、比对与审核,提升效率与准确性。平台强调本地部署,确保数据安全,解决低质量扫描件、复杂表格等痛点,降低人工成本与错误率,助力智慧政务发展。
521 0
|
C# 图形学
【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)
【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)
949 2

热门文章

最新文章