• 机器人占领就业市场后:人类还能从事这些工作 2019-03-04
  • 以网络文化建设推进文化惠民 2019-03-03
  • 贸易战,只能是双输。我们是众志成城,美国却不一定。 2019-02-26
  • 辣评2016年9月最HOT 轿车获奖榜单 2019-02-22
  • 交通运输部路网中心:端午假期高速通行不免费 2019-02-18
  • 《陕西省县域经济社会发展监测考评办法》解读 2019-02-18
  • 西部网(陕西新闻网)www.cnwest.com 2019-02-13
  • 短途一日游 游客量猛增 小长假新疆接待游客353.6万人次 2019-02-13
  • 南昌重拳整治酒驾毒驾 2019-02-08
  • 女性之声——全国妇联 2019-02-08
  • 信息网络传播视听节目许可证 2019-02-03
  • 打开书籍,了解文物背后的中国温度 2019-02-03
  • 中央环保督察组:石家庄市无极县“敷衍整改” 2019-02-02
  • China Focus Dragon Boat Festival celebrated across China - Culture News - CQNEWS 2019-02-02
  • 铁路迎端午客流最高峰 今日预计发送旅客1318万人次 2019-01-28
  • 【游戏技术群】959392658  【游戏出海群】12067810
    福建36选7和值走势图 手机端
    查看: 17677|回复: 137
    发新帖

    今晚广东36选7开奖号码: [Unity教程] 在Unity中创建攻击Slot系统

      [复制链接]  [移动端链接]
    排名
    9767
    昨日变化
    2

    福建36选7和值走势图 www.00-na.com 263

    主题

    301

    帖子

    1602

    积分

    Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

    UID
    159865
    好友
    9
    蛮牛币
    3981
    威望
    0
    注册时间
    2016-8-1
    在线时间
    626 小时
    最后登录
    2018-3-8

    蛮牛译员

    跳转到指定楼层
    楼主
    发表于 2017-10-15 13:21:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?注册帐号

    x
    在Unity中创建攻击Slot系统



    如果您打算在3D(或自顶向下的)游戏中有多个攻击玩家的敌人,那么您将需要一个攻击槽系统。 在我们的最后一篇科技文章中,我们开始构建一个航点路径系统。 我们继续使用AI教程并构建攻击槽系统! 这里的一个重要细节是,该系统实际上并不适用于基于路基的系统,因此我们将使用Unity内置的navmesh支持跟踪slot效果


    什么是Attack Slots

    攻击槽系统通常相当简单,可以使战斗看起来更好。 基本上,他们的做法是为每个攻击者分配一个攻击位置,以便攻击者不受束缚,位置可以是围绕攻击者,或者正面排列面对玩家。 如果您一次只希望有一个攻击者,那这个系统就不会有任何帮助,但是有两个以上的攻击者这可能是一个非常有用的工具。

    没有Attack Slots



    带有Attack Slots



    应该很清楚的是,在Attack Slots系统中,AI控制的实体看起来更加聪明,行为更有条理。


    创建场景


    首先要做的是与玩家和敌人一起创建一个简单的场景。 我刚刚添加了一个plane和一些立方体和气缸的障碍物。 然后为玩家以及敌人创建了一个胶囊。


    确保您已将导航窗口打开并对焦。 然后创建NavMesh,选择plane,立方体和圆柱体(但不是播放器和敌人),并在导航窗口的对象选项卡上选择导航静态:


    现在你可以去转到烘焙选项卡,点击烘焙按钮:



    你应该看到这样的东西:




    下一步是将Nav Mesh Agent组件添加到Enemy和Player中:




    不要担心任何设置,如果你不想要的。


    player控制器

    让我们制作一个简单的PlayerController脚本,以便我们可以移动播放器:

    [C#] 纯文本查看 复制代码
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AI;
    public class PlayerController : MonoBehaviour {
            // Use this for initialization
            void Start () {
                   
            }
           
            // Update is called once per frame
            void Update () {
                    if (Input.GetMouseButtonDown (0))
                    {
                            var mpos = Input.mousePosition;
                            mpos.z = 10;
                            var ray = Camera.main.ScreenPointToRay (mpos);
                            RaycastHit hit;
                            if (Physics.Raycast (ray, out hit))
                            {
                                    GetComponent<NavMeshAgent> ().destination = hit.point;
                            }
                    }
            }
    }


    在更新中,我们只是检查鼠标左键是否按下此框。 如果是这样,通过屏幕将光线投射到鼠标的位置。 如果它碰到任何东西,指导玩家移动到那一点。 所以现在我们可以点击左键移动player。 将此组件附加到player。


    初始敌军控制器

    现在来简单的创建一下EnemyController:


    [C#] 纯文本查看 复制代码
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AI;
    public class EnemyController : MonoBehaviour {
            GameObject target = null;
            float pathTime = 0f;
            // Use this for initialization
            void Start () {
                    target = GameObject.Find ("Player");
            }
           
            // Update is called once per frame
            void Update () {
                    pathTime += Time.deltaTime;
                    if (pathTime > 0.5f)
                    {
                            pathTime = 0f;
                            var tpos = target.transform.position;
                            var offset = (transform.position - tpos).normalized * 1.5f;
                            GetComponent<NavMeshAgent> ().destination = tpos + offset;
                    }
            }
    }


    首先,在开始,我们只是缓存播放器作为我们的目标。 然后在更新中,每0.5秒,我们得到玩家的位置,从我们的方向计算出1.5个单位的偏移量,然后将其设置为路径目的地。 将此组件附加到敌人。 这就是没有攻击槽系统的东西。




    这只是一个敌人。 很多敌人看起来不太好:




    这通?;崾鼓愕牡腥丝雌鹄床恢悄?,如果你是在根据目标的距离进行攻击,那么背后的敌人可能不会被攻击。 如果他们都可以在玩家身上摆动,这样他们可以更快地杀死他们会更好! 这是我们的AttackSlots引进的原因。


    创建Slot Manager

    我们可以创建一个新的文件 SlotManager并添加一些初始代码:


    [C#] 纯文本查看 复制代码
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    public class SlotManager : MonoBehaviour
    {
            private List<GameObject> slots;
            public int count = 6;
            public float distance = 2f;
            void Start()
            {
                    slots = new List<GameObject> ();
                    for (int index = 0; index < count; ++index)
                    {
                            slots.Add (null);
                    }
            }
    }


    SlotManager真的只包含一个用于GameObjects的插槽列表,然后是参数来定义要创建多少个插槽以及它们距离防御器的距离。 在开始,我们只是将这些插槽初始化为null。 该系统的工作方式,如果一个插槽为空,那么它是空的。 当它设置为一个GameObject时,它被认为在使用或者满了。



    获得Slots的位置


    我们需要一个函数来返回Slots的位置。 我们希望这些slot围绕GameObject排列成一个圆圈:


    每个线框球代表一个槽,第一个槽是顶部的。 之后插槽顺时针旋转。 以下是GetSlotPosition的代码:

            public Vector3 GetSlotPosition(int index)
            {
                    float degreesPerIndex = 360f / count;
                    var pos = transform.position;
                    var offset = new Vector3 (0f, 0f, distance);
                    return pos + (Quaternion.Euler(new Vector3(0f, degreesPerIndex * index, 0f)) * offset);
            }

    因此,首先,我们计算每个索引的度数,以确定每个插槽有多远(角度方向)。 然后,我们旋转一个向量指向z方向的新向量,该插槽的度数,并将其添加到我们的位置以获得插槽位置。


    预留槽位

    现在要做一个方法来为攻击者预留一个插槽:

            public int Reserve(GameObject attacker)
            {
                    var bestPosition = transform.position;
                    var offset = (attacker.transform.position - bestPosition).normalized * distance;
                    bestPosition += offset;
                    int bestSlot = -1;
                    float bestDist = 99999f;
                    for (int index = 0; index < slots.Count; ++index)
                    {
                            if (slots [index] != null)
                                    continue;
                            var dist = (GetSlotPosition (index) - bestPosition).sqrMagnitude;
                            if (dist < bestDist)
                            {
                                    bestSlot = index;
                                    bestDist = dist;
                            }
                    }
                    if (bestSlot != -1)
                            slots [bestSlot] = attacker;
                    return bestSlot;
            }

    这会变得更复杂一些。 您可能会从EnemyController的初始代码中识别前3行:

                    // EnemyController.cs
                    var tpos = target.transform.position;
                    var offset = (transform.position - tpos).normalized * 1.5f;
                    GetComponent<NavMeshAgent> ().destination = tpos + offset;

                    // SlotManager.cs
                    var bestPosition = transform.position;
                    var offset = (attacker.transform.position - bestPosition).normalized * distance;
                    bestPosition += offset;

    如前所述,我们发现一个靠近防守者的位置在攻击者的方向。 这将是我们想要的槽的最佳位置,因为它理想地意味着不必走到通??雌鹄床缓玫姆朗卣叩牧硪槐?。 接下来,我们通过所有插槽,找到当前没有使用的最接近的插槽。 如果存在的话,我们将它与攻击者进行填充,所以没有人可以接受攻击。就是这样!


    释放Slot


    [C#] 纯文本查看 复制代码
            public void Release(int slot)
            {
                    slots [slot] = null;
            }



    如果你紧跟我的步骤,下面要做的并不奇怪。 所有需要做的是将哪个信号保留为空的插槽设置为空,以供下一个攻击者使用。



    添加一个调试演示

    还有一件事我们可以做,如果需要,这是添加一些Gizmos像在上面的图像。 为此,我们可以定义OnDrawGizmosSelected:


          
    [C#] 纯文本查看 复制代码
     void OnDrawGizmosSelected()
            {
                    for (int index = 0; index < count; ++index)
                    {
                            if (slots == null || slots.Count <= index || slots [index] == null)
                                    Gizmos.color = Color.black;
                            else
                                    Gizmos.color = Color.red;
                            Gizmos.DrawWireSphere (GetSlotPosition (index), 0.5f);
                    }
            }


    基本上,在编辑器中这样做是为了显示每个插槽。 在播放模式下,如果它们已被保留,它会将颜色显示为红色。


    更新敌方控制器

    最后一件事是向EnemyController添加一些将使用这个新系统的代码。 我们需要添加一个新的私有变量来保存当前保留的插槽,然后更改更新功能:


    [C#] 纯文本查看 复制代码
    public class EnemyController : MonoBehaviour {
            GameObject target = null;
            float pathTime = 0f;
            int slot = -1;
            // Use this for initialization
            void Start () {
                    target = GameObject.Find ("Player");
            }
           
            // Update is called once per frame
            void Update () {
                    pathTime += Time.deltaTime;
                    if (pathTime > 0.5f)
                    {
                            pathTime = 0f;
                            var slotManager = target.GetComponent<SlotManager> ();
                            if (slotManager != null)
                            {
                                    if (slot == -1)
                                            slot = slotManager.Reserve (gameObject);
                                    if (slot == -1)
                                            return;
                                    var agent = GetComponent<NavMeshAgent> ();
                                    if (agent == null)
                                            return;
                                    agent.destination = slotManager.GetSlotPosition (slot);
                            }
                    }
            }
    }


    现在,Update只是每0.5秒执行一次,但现在它在目标上得到了SlotManager。然后,如果没有分配槽,它会尝试预留一个槽。如果失败了,我们还没有别的办法,所以我们回来了。如果它有一个插槽,那么它只是使用GetSlotPosition将导航目标引导到插槽的位置。这就是它的一切!


    打包和未来的改进

    在此之前,您必须将SlotManager组件附加到player,但是一旦这样做,这里就是几个敌人的样子:



    需要注意的一件事是使用一对攻击对手的攻击插槽。如果他们都有攻击槽,他们可能会尝试永远相互围绕。相反,您需要检查这种情况,并且让任何想要攻击的人首先获得攻击槽。另一个参与者应该瞄准自己的位置,使攻击者的位置与攻击者的位置匹配。


    我们还可以添加一些改进,例如禁用在navmesh或墙壁另一侧的插槽,自动增加插槽数以适应攻击者的数量,或者我们可以根据不同的攻击范围添加多个攻击槽环。现在,我会把这些留给你来实现!







    原文标题:Building an Attack Slot System in Unity

    点评

    hao  发表于 2018-11-6 10:22

    评分

    参与人数 6鲜花 +15 收起 理由
    ^_^_MZSS0 + 2 很给力!
    xiaojianlu + 2 很实用,虽然是机翻的,感谢楼主.
    seany321 + 5 赞一个!
    qiqunlong + 3 很给力!
    Coool + 1
    VG_xiao + 2 很给力!

    查看全部评分


    7日久生情
    2880/5000
    排名
    2523
    昨日变化
    1

    2

    主题

    1851

    帖子

    2880

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    241666
    好友
    0
    蛮牛币
    10773
    威望
    0
    注册时间
    2017-9-6
    在线时间
    453 小时
    最后登录
    2019-1-31
    沙发
    发表于 2017-10-16 07:45:39 来自Mobile--- | 只看该作者
    感谢分享

    5熟悉之中
    915/1000
    排名
    3966
    昨日变化
    2

    14

    主题

    294

    帖子

    915

    积分

    Rank: 5Rank: 5

    UID
    176358
    好友
    0
    蛮牛币
    820
    威望
    0
    注册时间
    2016-11-4
    在线时间
    221 小时
    最后登录
    2019-3-15
    板凳
    发表于 2017-10-16 08:57:21 | 只看该作者

    6蛮牛粉丝
    1291/1500
    排名
    2568
    昨日变化
    1

    3

    主题

    161

    帖子

    1291

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    45560
    好友
    1
    蛮牛币
    52
    威望
    0
    注册时间
    2014-9-18
    在线时间
    565 小时
    最后登录
    2019-2-15
    地板
    发表于 2017-10-16 09:00:03 | 只看该作者
    感谢分享

    5熟悉之中
    923/1000
    排名
    3560
    昨日变化
    3

    0

    主题

    283

    帖子

    923

    积分

    Rank: 5Rank: 5

    UID
    229748
    好友
    0
    蛮牛币
    2654
    威望
    0
    注册时间
    2017-7-1
    在线时间
    220 小时
    最后登录
    2019-1-10
    5#
    发表于 2017-10-16 09:02:42 | 只看该作者
    6666 收藏了 支持了?。?!

    7日久生情
    4376/5000
    排名
    2317
    昨日变化
    4

    5

    主题

    3109

    帖子

    4376

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    209186
    好友
    5
    蛮牛币
    1126
    威望
    0
    注册时间
    2017-3-1
    在线时间
    652 小时
    最后登录
    2019-3-19
    6#
    发表于 2017-10-16 09:20:10 | 只看该作者
    感谢分享

    排名
    3110
    昨日变化
    1

    5

    主题

    61

    帖子

    854

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    146655
    好友
    1
    蛮牛币
    1281
    威望
    0
    注册时间
    2016-4-25
    在线时间
    312 小时
    最后登录
    2018-10-25
    7#
    发表于 2017-10-16 09:27:00 | 只看该作者
    player

    7日久生情
    1973/5000
    排名
    720
    昨日变化
    1

    0

    主题

    21

    帖子

    1973

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    64643
    好友
    2
    蛮牛币
    3813
    威望
    0
    注册时间
    2014-12-30
    在线时间
    686 小时
    最后登录
    2019-3-15
    8#
    发表于 2017-10-16 09:30:44 | 只看该作者
    很厉害啊

    2初来乍到
    126/150
    排名
    48115
    昨日变化
    20

    0

    主题

    71

    帖子

    126

    积分

    Rank: 2Rank: 2

    UID
    202756
    好友
    0
    蛮牛币
    8
    威望
    0
    注册时间
    2017-1-17
    在线时间
    51 小时
    最后登录
    2019-2-28
    9#
    发表于 2017-10-16 09:37:51 | 只看该作者
    很厉害啊

    7日久生情
    3203/5000
    排名
    322
    昨日变化

    1

    主题

    394

    帖子

    3203

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    2219
    好友
    1
    蛮牛币
    8760
    威望
    0
    注册时间
    2013-8-19
    在线时间
    972 小时
    最后登录
    2019-3-19
    10#
    发表于 2017-10-16 09:44:04 | 只看该作者
    这机器翻译得令人感动

    4四处流浪
    312/500
    排名
    12469
    昨日变化
    4

    0

    主题

    148

    帖子

    312

    积分

    Rank: 4

    UID
    211096
    好友
    1
    蛮牛币
    70
    威望
    0
    注册时间
    2017-3-10
    在线时间
    90 小时
    最后登录
    2019-1-9
    11#
    发表于 2017-10-16 09:52:33 | 只看该作者
    6666666666666666666

    5熟悉之中
    772/1000
    排名
    3313
    昨日变化
    3

    4

    主题

    77

    帖子

    772

    积分

    Rank: 5Rank: 5

    UID
    127539
    好友
    0
    蛮牛币
    3591
    威望
    0
    注册时间
    2015-11-1
    在线时间
    231 小时
    最后登录
    2019-3-16
    QQ
    12#
    发表于 2017-10-16 09:54:26 | 只看该作者
    6666666666666666

    5熟悉之中
    701/1000
    排名
    4636
    昨日变化
    4

    0

    主题

    242

    帖子

    701

    积分

    Rank: 5Rank: 5

    UID
    214896
    好友
    0
    蛮牛币
    243
    威望
    0
    注册时间
    2017-3-28
    在线时间
    143 小时
    最后登录
    2019-3-12
    13#
    发表于 2017-10-16 10:35:04 | 只看该作者
    感谢分析

    6蛮牛粉丝
    1016/1500
    排名
    3652
    昨日变化
    2

    1

    主题

    371

    帖子

    1016

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    122160
    好友
    1
    蛮牛币
    1669
    威望
    0
    注册时间
    2015-9-10
    在线时间
    236 小时
    最后登录
    2018-8-1
    14#
    发表于 2017-10-16 10:49:23 | 只看该作者
    感谢分享
    [发帖际遇]: Vincher 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

    3偶尔光临
    188/300
    排名
    10338
    昨日变化

    0

    主题

    27

    帖子

    188

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    245707
    好友
    0
    蛮牛币
    204
    威望
    0
    注册时间
    2017-9-24
    在线时间
    59 小时
    最后登录
    2018-1-10
    15#
    发表于 2017-10-16 10:49:26 | 只看该作者
    感谢分享

    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则

    快速回复 福建36选7和值走势图 返回列表
  • 机器人占领就业市场后:人类还能从事这些工作 2019-03-04
  • 以网络文化建设推进文化惠民 2019-03-03
  • 贸易战,只能是双输。我们是众志成城,美国却不一定。 2019-02-26
  • 辣评2016年9月最HOT 轿车获奖榜单 2019-02-22
  • 交通运输部路网中心:端午假期高速通行不免费 2019-02-18
  • 《陕西省县域经济社会发展监测考评办法》解读 2019-02-18
  • 西部网(陕西新闻网)www.cnwest.com 2019-02-13
  • 短途一日游 游客量猛增 小长假新疆接待游客353.6万人次 2019-02-13
  • 南昌重拳整治酒驾毒驾 2019-02-08
  • 女性之声——全国妇联 2019-02-08
  • 信息网络传播视听节目许可证 2019-02-03
  • 打开书籍,了解文物背后的中国温度 2019-02-03
  • 中央环保督察组:石家庄市无极县“敷衍整改” 2019-02-02
  • China Focus Dragon Boat Festival celebrated across China - Culture News - CQNEWS 2019-02-02
  • 铁路迎端午客流最高峰 今日预计发送旅客1318万人次 2019-01-28