【Untiy&项目分享&项目讲解】UnitZ的敌人生成系统 2 敌人AI逻辑说明
来源:互联网 发布:云计算实施工程师招聘 编辑:程序博客网 时间:2024/04/23 14:10
本文章就来说说UnitZ的敌人生成系统 2 敌人说明
-----------------------------------------------
敌人Zombie(Clone)有很多控件(
Animator、(动画控制)
Character Controller、(3D人物角色控制)
Human Character、(控制 角色 的动画、攻击动画、死亡动画)
Character Motor、(控制模型 移动的 动作、状态)
AI Character Controller、(AI 角色控制)
Network View、(参考资料1 、2)
FPS Ray Active、(FPS 射线检测)
Character Foot Step、(人物角色 脚部控制)
Audio Source(声音控制)
)
----------------------------------------
由Basecharacter皮肤
Bip001(图2
HitMark(被攻击的反应)
)
-Bip001 Footsteps(图3 敌人 脚步 的位置)
-Bip001 Pelvins(Spine 3D模型)
(图1)
(图4)
(图2)
(图3)
(图4)
------------------------------------------------------------
Bip001的 Damage Manage 对象 为 (通过图5 左方红色方框查找 相应的类)
其父类Zombie(Clone)(HumanCharacter) 继承自 CharacterSystem.cs
CharacterSystem.cs 继承自 DamageManager.cs
( 图5 )
(图2)
using UnityEngine;
using System.Collections;
public struct DamagePackage{//结构体 资料4
public Vector3 Position;
public Vector3 Direction;
public Vector3 Normal;
public int Damage;
public string ID;
public string Team;
}
public class HitMark : MonoBehaviour
{
public DamageManager DamageManage;//创建一个 DamageManager 类的变量
//CharacterSystem : DamageManager
// HumanCharacter : CharacterSystem
//DamageManage = Zombie(Clone) 的 HumanCharacter
public GameObject HitFX; //创建一个 对象 名字为HitFX
public float DamageMult = 1;
public bool Freeze = false;
void Start ()
{
if (this.transform.root)//这从来不返回null,如果这个变换没有父级,将返回自身。
{//获得父级 的DamageManager组件
DamageManage = this.transform.root.GetComponent<DamageManager> ();
} else
{//获得自身 的DamageManager组件
DamageManage = this.transform.GetComponent<DamageManager> ();
}
}
public void OnHit (DamagePackage pack)
{//DamageManage存在
if (DamageManage)
{//使得 伤害 实行 DamagePackage的伤害值,DamagePackage的方向,DamagePackage的ID,DamagePackage的TEAM
DamageManage.ApplyDamage ((int)((float)pack.Damage * DamageMult),pack.Direction,pack.ID,pack.Team);
}
if (!Freeze)
{//没有冻结,则进行移动 移动方向为pack.Direction.normalized
this.transform.position += pack.Direction.normalized;//normalized资料5
}//
if (pack.Normal != null)
{
Debug.Log("start pack.Normal " + pack.Normal);
}
ParticleFX (pack.Position, pack.Normal);//DamagePackage pack的坐标,DamagePackage pack的Normal
}
public void ParticleFX (Vector3 position, Vector3 normal)
{
if (HitFX)
{//HitFX是一个粒子效果,被攻击后 出 血迹 的效果
GameObject fx = (GameObject)GameObject.Instantiate (HitFX, position, Quaternion.identity);//生成HitFX
fx.transform.forward = normal;//DamagePackage的normal
if (normal!=null)
{
Debug.Log("normal " + normal);
}
GameObject.Destroy (fx, 3);
}
}
}
struct 结构体(参考资料6)
简单的来说.结构体就是一个可以包含不同数据类型的一个结构.它是一种可以自己定义的数据类型.
首先结构体可以在一个结构中声明不同的数据类型.
第二相同结构的结构体变量是可以相互赋值的.
第三.节省内存空间
第四.高效率.
http://img.blog.csdn.net/20170123000200306?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQnVsYWRlTWlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
http://img.blog.csdn.net/20170123000205822?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQnVsYWRlTWlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
Zombie(Clone)有个AI Character Controller组件,用于识别攻击目标(图5所示)Object Target
(图5)
Zombie(Clone)有个AI Character Controller组件,用于识别攻击目标(图5所示)Object Target
AI Character Controller组件获得Zombie(Clone)的其他组件CharacterSystem组件,然后
这个CharacterSystem组件Character有个DoDamage函数用来传递受伤的参数(为什么CharacterSystem组件会有这个参数)
(图6)
(图8)
Zombie(Clone)的public class HumanCharacter : CharacterSystem
的public class CharacterSystem : DamageManager
的public void SetupAwake ()
的 rayActive = this.GetComponent<FPSRayActive> ();这个rayActive获得了FPSRayActive组件的函数DoDamage(图7)
(图7)
在FPSRayActive组件中,有对ShootRay函数详细的定义(图9),其中就改变了DamagePackage变量的公共构造函数public struct DamagePackage(图10)
(图9)
(图10)
-----------------------------------------------------------------------------
总结一下
控制 敌人 的AI Character Control组件 是主要控制 敌人 AI 行动 的程序,用于逻辑循环判断
-----------------------------------------------------------------------------
AICharacterController
(右键 查看图片 可放大)
(逻辑总结一下)
--------------------------------------------------------------------------------
剩余部分传送门:
参考资料:
1.网络视图Network View
2.【教程】Unity3D NetworkView教程
3.Transform.root 根
4.Unity中的结构体(C#)
5.Vector3中normalized和Normalize()函数的区别
6.
C#中struct和class的区别详解
7.
- 【Untiy&项目分享&项目讲解】UnitZ的敌人生成系统 2 敌人AI逻辑说明
- 【Untiy&项目分享&项目讲解】UnitZ的敌人生成系统 1 敌人孵化器
- 软件项目的敌人
- Unity敌人的AI
- Advanced AI Pro - 设计智能化的敌人攻击系统
- 敌人
- Unity 代码碎片敌人的AI
- Unity 基于状态的简单敌人AI
- 敌人AI:行走
- 敌人AI:攻击
- Unity5.x制作合金弹头(三)-敌人AI逻辑
- Unity 内的敌人AI 或者 有限状态机FSM实现AI
- Unity敌人生成点的代码
- 2D 敌人生成 特效播放
- 行为树-学习笔记(2)-rain插件做简单的敌人AI(1)
- 行为树-学习笔记(3)-rain插件做简单的敌人AI(2)
- 角色扮演游戏中敌人AI(人工智能)的设计方法
- Unity3D--创建敌人和玩家之间的AI
- 编译LNMP环境
- 普通for循环和增强for循环处理数组元素的一个差别
- Java项目性能监控和调优工具-Javamelody
- PAT---1058. A+B in Hogwarts (20)
- 在javaWEB规范中使用Cookie
- 【Untiy&项目分享&项目讲解】UnitZ的敌人生成系统 2 敌人AI逻辑说明
- C# Selenium学习(四)-Cookie和窗口处理
- Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式
- Codefoeces 755A-PolandBall and Hypothesis
- Android之旅第三站——活动(Activity)的携带字符串数据的跳转…
- React中使用ECharts地图扩展
- 40个Java多线程问题总结
- android LayoutInflater.inflate()的参数及其用法
- [bigdata-34] pyenv + anaconda 4.2 + python3.5+ ubuntu 16.04 安装