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

首先是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. windows上如何搭建Git Server

    Git在版本控制方面,相比与SVN有更多的灵活性,对于开源的项目,我们可以托管到Github上面,非常方便,但是闭源的项目就会收取昂贵的费用.那么私有项目,如何用Git进行代码版本控制呢?我们可以自己 ...

  2. jQuery拖动剪裁图片作为头像

    图片上传是许多网站的一个常用的功能,有时需要对上传的图片做初步的选择裁剪,比如上传头像.下面就是一个使用HTML5+jQuery实现的图片上传裁剪特效,可以对选择要上传的图片做缩小.放大.拖动和裁剪, ...

  3. 【原】tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig的解决

    现象: tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig() ...

  4. js通过循环多张图片实现动画效果

    以小鱼摇尾巴和眨眼睛为例 动画思路: 1.将图片资源放在数组里面 2.通过计时器来设定间隔时间 3.通过计数器来取相应的图片 第一步:基本框架,鱼身体 <body> <canvas ...

  5. H5 meta小结

    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1, ...

  6. javascript操作系统检测

    function detectOS() { var sUserAgent = navigator.userAgent;console.log(sUserAgent); var isWin = (nav ...

  7. CRM sql 查询

    转自博友"菜刀-soft"! 查询实体信息: --查询实体信息,实体名称:account select * from MetadataSchema.Entity where nam ...

  8. 对iOS10新增Api的详细探究

    本文主要是一些对iOS新功能的探索,之前发现博客里关于iOS新功能的分析大多是过于概括,每个功能几句话,无法了解到具体的功能.所以本次的探索是基于Api层面,着重看一些具体用法所做的笔记,本来想分别画 ...

  9. 怎么修改与设置.jsp文件属性?

    1.首先  打开  >>  Myeclipse或Eclipse.(我用的是Myeclipse) 2.打开  >>  Window  >>  Preferences  ...

  10. VS插件开发 - 登录身份验证

    [附加] 很多朋友问那个VS背景怎么弄的,我刚刚已经抽时间把制作步骤发出来了: 请参见<VS插件开发 - 个性化VS IDE编辑器,瞬间 高 大 上>. 最近一直在忙着一些事情,一直没有发 ...