练手小游戏(代码篇之敌人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游戏). 大家 ...
随机推荐
- [deviceone开发]-openPage的动画效果示例
一.简介do_App的openPage支持16种过场动画,这个示例直观的展示16种动画的效果.适合初学者.二.效果图三.相关下载https://github.com/do-project/code4d ...
- Project server 2016 “没有为此项目配置网站”错误处理
问题: 没有为此项目配置网站. There is no site configured for this project 解决办法: 依次点击设置>PWA设置>连接到sharepoint网 ...
- java web之个人通讯录系统
前天下了第一场雪,专业课老师给我们布置了一个期末小作业,真的感觉到寒假就要来临了.这个学期没过多久就要结束了.总结这学期,感觉还是有不少收获的.完成了当初许下的诺言,现在也越来越喜欢软件这个行业了,虽 ...
- Undefined symbols for architecture arm64解决方案
在iOS开发中经常遇到的一个错误是Undefined symbols for architecture arm64,这个错误表示工程某些地方不支持arm64指令集.那我们应该怎么解决这个问题了?我们不 ...
- minSdkVersion maxSdkVersion targetSdkVersion target 的区别
minSdkVersion 描述:app最低支持的sdk版本号 作用:如果手机SdkVersion小于app中定义的minSdkVersion,则android系统不允许安装该app 定义位置:And ...
- android AES 加密
import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import jav ...
- win10打开IL DASM步骤:
- 压缩和解压文件:tar gzip bzip2 compress(转)
tar[必要参数][选择参数][文件] 压缩:tar -czvf filename.tar.gz targetfile解压:tar -zxvf filename.tar.gz参数说明: -c 建立新的 ...
- gridview安卓实现单行多列横向滚动
<GridLayout android:layout_width="match_parent" android:layout_height="match_paren ...
- QC在win7下不能访问QC服务器介绍
本地访问不了服务器QC的主要几个原因总结 服务器serverjbossextensionhpcmd 2016-03-24 兼容性问题: 1.在服务端QC的安装目录下jboss\server\def ...