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

首先是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. 如果把带有html的标记的字符串从服务端传到页面上,需要对其进行编码。Ajax.JavaScriptStringEncode()

    controller: StringBuilder s = new StringBuilder(); string a = "<script>alert('我StringBuil ...

  2. SharePoint 2010 数据库xxx的事务日志已满

    接到领导安排,说客户有问题 请求协助解决,对方给我展示的错误日志,如下: 数据库'WSS_Content_xxxx'的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅sy.databases中 ...

  3. CRM 2013 相关下载 / 2013-10-11

        CRM 2013的安装文件,软件开发工具包(Sdk)以及实施指南,在微软官方网站已经有下载了.     具体地址如下: Name Url 发布日期 语言版本 说明 CRM Server htt ...

  4. Android开发aidl使用中linkToDeath和unlinkToDeath的使用

    1.Binder死亡代理     这一节首先将介绍Binder类中比较重要的两个方法linkToDeath和unlinkToDeath.我们知道Binder是运行在服务进程,若服务端进程因为某种原因“ ...

  5. android 帧动画,补间动画,属性动画的简单总结

      帧动画——FrameAnimation 将一系列图片有序播放,形成动画的效果.其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用 在Drawable文件夹下,创建ani ...

  6. 自定义UITableViewCell实现左滑动多菜单功能LeftSwipe

    今天愚人节,小伙们,愚人节快乐! 实现一个小功能,滑动菜单,显示隐藏的功能菜单, 先上图:                       这里尝试用了下使用三个方式来实现了这个功能: 1.使用自定义UI ...

  7. 移动端嵌入pdf.js远程请求pdf出现(206)

    最近在做移动端的开发,需要嵌入pdf进行预览.看了很多的js组件后选择了pdf.js:使用起来还是比较方便的,至于使用网上有很多的教程. 但在使用过程中出现了如下一个问题(我做的是IOS系统): 问题 ...

  8. java 接口的作用和好处

    1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意 ...

  9. Oracle汉字转拼音package

    --函数GetHzFullPY(string)用于获取汉字字符串的拼音 --select GetHzFullPY('中华人民共和国') from dual; --返回:ZhongHuaRenMinGo ...

  10. MPI-2 并行IO的使用方法

    写的MPI程序需要用到并行IO来操作文件,但是搜遍了度娘都没有找到多少关于并行IO函数的使用方法.最后在知网搜到了一些有用的论文,看了一下,感觉豁然开朗. MPI-1对文件的操作是使用绑定语言的函数调 ...