【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)

Bip001(图2 HitMark(被攻击的反应))

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.

0 0
原创粉丝点击