诶呀~又没有更新微博,去拔牙了,疼死了,休息了几天过来接着写代码~

首先是Base。写了一个框架,照别人扒的。

Base分三部分,AILocomotion(AI移动),Steering(行为基类),Vehicle(角色模型基类)

首先是Steering

/// <summary>
/// 角色行为基类
/// </summary>
public class Steering : MonoBehaviour { /// <summary>
/// 操控权重
/// </summary>
public float weight = ; void Start () { } void Update () { } /// <summary>
/// 计算操控力。由子类去实现
/// </summary>
/// <returns></returns>
public virtual Vector3 Force()
{
return Vector3.zero;
}
}

其次是角色行为基类

/// <summary>
/// 角色模型基类
/// </summary>
public class Vehicle : MonoBehaviour { /// <summary>
/// 行为列表
/// </summary>
private Steering[] steerings; /// <summary>
/// 操控力
/// </summary>
private Vector3 steeringForce; /// <summary>
/// 最大的力
/// </summary>
public float maxForce; /// <summary>
/// 角色质量
/// </summary>
private float mass = ; /// <summary>
/// 加速度
/// </summary>
protected Vector3 acceleration; /// <summary>
///控制力计算间隔时间
/// </summary>
private float computeInterval = 0.2f; /// <summary>
/// 计时器
/// </summary>
private float timer; /// <summary>
/// 位移速度
/// </summary>
public Vector3 speed;
/// <summary>
/// 最大速度
/// </summary>
public float maxSpeed = ;
/// <summary>
/// 最大速度的平方
/// </summary>
public float sqrtMaxSpeed;
/// <summary>
/// 转向速度
/// </summary>
public float damping = 0.9f;
/// <summary>
/// 是否是平面
/// </summary>
public bool isPanar = false; protected void Start () {
steeringForce = Vector3.zero;
timer = ;
steerings = GetComponents<Steering>();
sqrtMaxSpeed = maxSpeed * maxSpeed;
} void Update () { //每过computeInterval的时间就处理一下当前所有行为力的合力
timer += Time.deltaTime;
steeringForce = Vector3.zero; 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 = ;
}
}
}

最后是AI移动类

/// <summary>
/// 角色移动类
/// </summary>
public class AILcomotion : Vehicle { /// <summary>
/// AI角色控制器
/// </summary>
private CharacterController mController;
private Rigidbody mRigidbody; /// <summary>
/// 每次移动的距离
/// </summary>
private Vector3 mMoveDistance; void Start () {
mController = GetComponent<CharacterController>();
mRigidbody = GetComponent<Rigidbody>();
mMoveDistance = Vector3.zero;
base.Start();
} void FixedUpdate () {
speed = speed + acceleration * Time.fixedDeltaTime;
if (speed.sqrMagnitude > sqrtMaxSpeed)
{
speed = speed.normalized * maxSpeed; //float 转 Vector3
}
//计算角色移动距离
mMoveDistance = speed * Time.fixedDeltaTime; if (isPanar)
{
speed.y = ;
} if (mController)
{
mController.SimpleMove(speed);
}
else if (mRigidbody == null || mRigidbody.isKinematic) //如果Rigidbody为空或受物理影响修改位置
{
transform.position += mMoveDistance;
}
else
{
mRigidbody.MovePosition(mRigidbody.position + mMoveDistance);
} if (speed.sqrMagnitude > 0.0001f)
{
Vector3 newForward = Vector3.Slerp(transform.forward, speed, damping * Time.fixedDeltaTime);
if (isPanar)
{
newForward.y = ;
}
transform.forward = newForward;
}
}
}

之后就是各个行为的实现比如一个抵达行为

/// <summary>
/// 抵达
/// </summary>
public class Arrive : Steering { /// <summary>
/// 靠近的目标
/// </summary>
public GameObject target; /// <summary>
/// 减速半径
/// </summary>
public float slowDownDistance; /// <summary>
/// 预期速度
/// </summary>
private Vector3 mDesiredVelocity; /// <summary>
/// AI角色
/// </summary>
private Vehicle mVehicle; void Start()
{
mVehicle = GetComponent<Vehicle>();
} public override Vector3 Force()
{
//与目标之间的距离
Vector3 toTarget = target.transform.position - transform.position;
if (mVehicle.isPanar)
{
toTarget.y = ;
} if (toTarget.magnitude < slowDownDistance)
{
//计算预期速度
mDesiredVelocity = toTarget - mVehicle.speed;
}
else
{
//计算预期速度
mDesiredVelocity = toTarget.normalized * mVehicle.maxSpeed;
} if (mVehicle.isPanar)
{
mDesiredVelocity.y = ;
}
//返回操控向量
return (mDesiredVelocity - mVehicle.speed);
}
}

目前还没有学习行为树的写法,目前就是把各个行为都放到角色上运行,有点臃肿。

练手小游戏(代码篇之敌人AI的更多相关文章

  1. 【CTF】某xss练手小游戏

    http://test.xss.tv 1.http://47.94.13.75/test/level1.php?name=test 直接插入即可,如: http://47.94.13.75/test/ ...

  2. 【Python】【辅助程序】练手小程序:记录外网动态IP地址

    练手小程序 程序作用:对IP实时记录: 1.定时获取外网IP,存储在本地文件中: 编写思路: 1)收集获取外网的API接口       http://bbs.125.la/thread-1383897 ...

  3. 自定义View4-塔防小游戏第一篇:一个防御塔+多个野怪(简易版)*

    塔防小游戏 第一篇:一个防御塔+多个野怪(简易版)    1.canvas画防御塔,妖怪大道,妖怪行走路线    2.防御塔攻击范围是按照妖怪与防御塔中心距离计算的,大于防御塔半径则不攻击,小于则攻击 ...

  4. 【Python精华】100个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...

  5. 整理了适合新手的20个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. 本文附带基础视频教程:私信回复[基础]就可以获取的 [程序1] ...

  6. 2048小游戏代码解析 C语言版

    2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图:  游 ...

  7. 初始Spring MVC——练手小项目

    初始Spring MVC 前几天开始了我的spring学习之旅,由于之前使用过MVC模式来做项目,所以我先下手的是 Spring MVC,做个练手项目,非常简单 项目介绍: 用户输入信息 -> ...

  8. java小游戏代码

    一. 需求分析 曾几何时,游戏是海洛因的代名词,让人与玩物丧志联系在一起.一度遭到社会反感和家长抵制.可是.随着互联网的发展,和游戏潜在优点被发现.游戏的价值開始逐渐被社会认可,人们開始接受.认识和了 ...

  9. 一款WP小游戏代码分享

    首先声明游戏是H5的代码,当然游戏部分不是我写的,感谢@LeZhi的分享,关于H5我还在学习,这里只是简单介绍一下如何把一款现成的H5游戏封装成一款WP游戏(当然也可以做成Windows游戏). 大家 ...

随机推荐

  1. xUtils 3.0 post使用详解

    github:https://github.com/wyouflf/xUtils3 xUtils3简介 xUtils 包含了很多实用的android工具. xUtils 支持超大文件(超过2G)上传, ...

  2. 记录一次Quartz2D学习(五)

    (四)内主要讲了绘制状态的保存与恢复 本次主要讲述 缩放,旋转,平移等操作 5.附加操作 5.1 旋转 TIP: 旋转操作主要是对本次渲染的图层进行旋转,旋转的中心为左上角顶点 - (void)dra ...

  3. web方式修改svn密码

    原帖:http://www.iusesvn.com/bbs/viewthread.php?tid=20 之前的Apache22Passwd版本有个小bug,用现在的浏览器会显示空白页.这个版本Apac ...

  4. 原创 C++之常量(二)

    4常量的内存分配 4.1应用程序的内存结构 一个由C++编译的应用程序,占用的内存可以划分为如下几个部分: 栈(stack).由编译器自动分配释放.存放函数参数和函数里的局部变量(又称自动变量).其操 ...

  5. 终于将rsync-3.1.2配置成功,之外还挖掘了一些新的用法

    1.为什么要用rsync: 有两台主机,开始准备做HA,考虑到工作量的问题,最终决定将重要文件进行同步即可. 找了一些同步的工具,rsync得到一致好评,速度快,消耗小等等. 2.接着找资料,最后选用 ...

  6. Ubuntu apt 常用命令

     APT(the Advanced Packaging Tool)是Ubuntu 软件包管理系统的高级界面,Ubuntu 是基于Debian的,APT由几个名字以“apt-”打头的程序组成.apt-g ...

  7. Mysql 的特殊之处

    互联网公司一般都会选择在互联网得到广泛应用的Mysql,但之前一直用微软的东东,包括数据库(MS SQLServer). 这不本以为切换数据库so easy,但是还是有些细节需要注意. 数据类型 Da ...

  8. JS--浏览器兼容之new Date

    Js 中有一个Date属性. 我们可以通过new Date(formatString) 来生命日期. 不过生命日期里面有一个坑就是. new Date('2016-05-13'), Chrome 和 ...

  9. Linux服务器安全登录设置记录

    在日常运维工作中,对加固服务器的安全设置是一个机器重要的环境.比较推荐的做法是:1)严格限制ssh登陆(参考:Linux系统下的ssh使用(依据个人经验总结)):     修改ssh默认监听端口    ...

  10. Linux-./configure: error: the HTTP rewrite module requires the PCRE library.

    这个问题是要解决: yum -y install pcre-devel 然后在yum的时候发现出错.问题是我的linux不能上网. 这个问题搞得烦死了.和主机能ping.但是就是不能上网: ping ...