练手小游戏(代码篇之敌人AI
诶呀~又没有更新微博,去拔牙了,疼死了,休息了几天过来接着写代码~
首先是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的更多相关文章
- 【CTF】某xss练手小游戏
http://test.xss.tv 1.http://47.94.13.75/test/level1.php?name=test 直接插入即可,如: http://47.94.13.75/test/ ...
- 【Python】【辅助程序】练手小程序:记录外网动态IP地址
练手小程序 程序作用:对IP实时记录: 1.定时获取外网IP,存储在本地文件中: 编写思路: 1)收集获取外网的API接口 http://bbs.125.la/thread-1383897 ...
- 自定义View4-塔防小游戏第一篇:一个防御塔+多个野怪(简易版)*
塔防小游戏 第一篇:一个防御塔+多个野怪(简易版) 1.canvas画防御塔,妖怪大道,妖怪行走路线 2.防御塔攻击范围是按照妖怪与防御塔中心距离计算的,大于防御塔半径则不攻击,小于则攻击 ...
- 【Python精华】100个Python练手小程序
100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...
- 整理了适合新手的20个Python练手小程序
100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. 本文附带基础视频教程:私信回复[基础]就可以获取的 [程序1] ...
- 2048小游戏代码解析 C语言版
2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图: 游 ...
- 初始Spring MVC——练手小项目
初始Spring MVC 前几天开始了我的spring学习之旅,由于之前使用过MVC模式来做项目,所以我先下手的是 Spring MVC,做个练手项目,非常简单 项目介绍: 用户输入信息 -> ...
- java小游戏代码
一. 需求分析 曾几何时,游戏是海洛因的代名词,让人与玩物丧志联系在一起.一度遭到社会反感和家长抵制.可是.随着互联网的发展,和游戏潜在优点被发现.游戏的价值開始逐渐被社会认可,人们開始接受.认识和了 ...
- 一款WP小游戏代码分享
首先声明游戏是H5的代码,当然游戏部分不是我写的,感谢@LeZhi的分享,关于H5我还在学习,这里只是简单介绍一下如何把一款现成的H5游戏封装成一款WP游戏(当然也可以做成Windows游戏). 大家 ...
随机推荐
- 学习廖雪峰的git教程
地址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 1.git add:添加文件 ...
- eclipse SE增加Web开发插件
最近接触了些java项目,之前安装了eclipse SE版本.没有Web开发插件,调试不了Web代码.点击“Window”--“Preference” 左边菜单栏是找不到“Server”项来配置服务器 ...
- css_03之文本、浮动
1.字体属性:①字体格式:font-family:取值:“microsoft yahei”/Arial……:②字体大小:font-size:取值:pt/px:③字体加粗:font-weight:取值: ...
- gulp-uglify 与gulp.watch()配合使用时遇到的重复压缩问题
今天学习gulp时候,用到gulp-uglify压缩js模块,遇到的一个问题-当用gulp.watch来监听js文件的变动时出现重复压缩的问题 目录结构如下: gulpfile.js代码如下: var ...
- SharePoint Server2016的User Profile Services服务
前言SharePoint Server 的早期版本具有内置的 ForeFront Identity Manager (FIM) 副本,可在 SharePoint Server 服务器产品内运行.具 ...
- 【centos7】添加开机启动服务/脚本
一.添加开机自启服务 在centos7中添加开机自启服务非常方便,只需要两条命令(以Jenkins为例): systemctl enable jenkins.service #设置jenkins服务为 ...
- JavaScript 常用代码
未知对象 对象类型名称:xobject.constructor.name 对象成员键名:Object.keys(xobject) 枚举对象成员及其值:for(var propertyName in r ...
- Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead的解决办法
今天在导入工程进Eclipse的时候竟然出错了,控制台输出的是: [2013-02-04 22:17:13 - takepicture] Android requires compiler compl ...
- Highchart基础教程-图表配置
一.图表容器: Highcharts 实例化中绑定容器的两种方式: 1.通过 dom 调用 highcharts() 函数的方式 $("#container").highchart ...
- PHP中的数据库一、MySQL优化策略综述
前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库.我们都知道,PHP开发中,数据的增删改查是核心.为了提升PHP的运行效率,程序员不光需要写出逻辑清晰,效率很高的代码,还要能对 ...