游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:780

当前位置:游戏蛮牛 技术专区 教程分享

查看: 298|回复: 8

[入门教程] 【Unity入门实例教程】第四章 AI及动画混合

[复制链接]  [移动端链接]
排名
22655
昨日变化
1183

6

主题

18

帖子

58

积分

Rank: 2Rank: 2

UID
292365
好友
1
蛮牛币
316
威望
0
注册时间
2018-8-3
在线时间
16 小时
最后登录
2018-8-15
发表于 7 天前 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 阿莱克斯 于 2018-8-9 16:22 编辑

这两天因为研究“四元数旋转”死了不少脑细胞在养伤
这章主要内容是敌人的AI控制
screenshot_20180809_160810.png

先贴出来代码
[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*
 * 基本思路:
 * 1. 七秒钟进行一次攻击
 * 2. 每次攻击先向前飞行  再随机播放攻击动画  然后调头回去
 * */
public class Death_Wing : MonoBehaviour
{
    //设置动画控制器
    public Animator anim;

    //主角游戏对象
    public Camera player;

    //记录敌人上一次思考时间
    private float aiThankLastTime;

    //记录当前是否为攻击状态
    private bool isAttack;
    //持续攻击状态
    private bool Continue_Attack = false;
    //记录攻击动画,外部控制防止无限循环
    private int randomNum = 0;

    void Start()
    {
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        isTime();
        if(isAttack==true || Continue_Attack == true)
        {
            Attack();   //因为有移动操作,所以用上time.deltatime,所以要放到update里
        }
    }

    //时间函数
    void isTime()
    {
        //这里表示敌人每4.5秒进行一次攻击
        if (Time.time - aiThankLastTime >= 4.5f)
        {
            aiThankLastTime = Time.time;
            isAttack = true;
            Continue_Attack = true;
        }
        else
        {
            anim.SetFloat("AttackNum", 0f);
            isAttack = false;
        }
    }
    //攻击函数
    void Attack()
    {
        // 判断敌人与主角之间的距离
        float distance = Vector3.Distance(player.transform.position, this.transform.position);
        if (distance <= 4.0f)
        {
            //达到指定距离,开始播放攻击动画
            //随机数控制随机攻击
            randomNum = new System.Random().Next(1, 3);
            switch (randomNum)
            {
                case 1:
                    anim.SetFloat("AttackNum", 1.0f);
                    break;
                case 2:
                    anim.SetFloat("AttackNum", 2.0f);
                    break;
                case 3:
                    anim.SetFloat("AttackNum", 3.0f);
                    break;
            }

            Continue_Attack = false;
        }
        else
        {
            //控制死亡之翼向左追击
            //当敌人进入追击状态时,将面朝主角方向奔跑
            this.transform.LookAt(player.transform);
            transform.Translate(0, 0, 4.0f * Time.deltaTime, Space.Self);
        }
    }
}




AI的部分有基础的萌新也可以看懂
主要讲一下动画的混合
网上的教程有说用blend tree的,我的感觉就是 学不会 注意红字部分
screenshot_20180809_161404.png

screenshot_20180809_161417.png

左侧Layers部分有两个,我新建了一个Attacks层
Base Layer里面是飞行动画
Attack里面是攻击动画
修改权重(权重大概可以理解为重要程度,或者是体现度)权重为0就不混合,权重越大体现的程度越高
screenshot_20180809_161428.png
参考资料:研究院之游戏开发中的人工智能AI(三十八)




回复

使用道具 举报

4四处流浪
437/500
排名
10668
昨日变化
127

5

主题

217

帖子

437

积分

Rank: 4

UID
285521
好友
0
蛮牛币
864
威望
0
注册时间
2018-6-12
在线时间
117 小时
最后登录
2018-8-16
发表于 7 天前 | 显示全部楼层
谢谢分享哦,怪物模型也帅
[发帖际遇]: 董庆磊 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

排名
18102
昨日变化
560

0

主题

43

帖子

91

积分

Rank: 2Rank: 2

UID
292147
好友
0
蛮牛币
238
威望
0
注册时间
2018-8-1
在线时间
16 小时
最后登录
2018-8-16
发表于 7 天前 | 显示全部楼层
66666666666

回复

使用道具 举报

6蛮牛粉丝
1306/1500
排名
3057
昨日变化
15

0

主题

528

帖子

1306

积分

Rank: 6Rank: 6Rank: 6

UID
182268
好友
2
蛮牛币
647
威望
0
注册时间
2016-11-9
在线时间
338 小时
最后登录
2018-8-16
发表于 6 天前 | 显示全部楼层
挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好
[发帖际遇]: 15910553283 被钱袋砸中进医院,看病花了 2 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
848/1000
排名
3594
昨日变化
3

0

主题

226

帖子

848

积分

Rank: 5Rank: 5

UID
144229
好友
0
蛮牛币
1302
威望
0
注册时间
2016-4-1
在线时间
242 小时
最后登录
2018-8-16
发表于 6 天前 | 显示全部楼层
谢谢楼主分享,我研究四元数也死了不少脑细胞

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1011/1500
排名
4832
昨日变化
32

0

主题

596

帖子

1011

积分

Rank: 6Rank: 6Rank: 6

UID
210390
好友
0
蛮牛币
1102
威望
0
注册时间
2017-3-7
在线时间
141 小时
最后登录
2018-8-16
发表于 6 天前 | 显示全部楼层

回复

使用道具 举报

排名
22655
昨日变化
1183

6

主题

18

帖子

58

积分

Rank: 2Rank: 2

UID
292365
好友
1
蛮牛币
316
威望
0
注册时间
2018-8-3
在线时间
16 小时
最后登录
2018-8-15
 楼主| 发表于 6 天前 | 显示全部楼层
vv独望w 发表于 2018-8-10 11:17
谢谢楼主分享,我研究四元数也死了不少脑细胞

关于人物移动和使用四元数的平滑旋转(超级无敌改进版,比网上的好用)
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.Linq;
public class Walk_Controller : MonoBehaviour
{
    public float speed = 3.0f;            //玩家移动速度
 
    Vector3 movement;                   // 玩家移动临时变量
    Animator anim;                      //玩家身上动画控制器
    Rigidbody playerRigidbody;          //玩家身上刚体组件
 
 
    void Awake()
    {
        // 获取玩家身上各组件
        anim = GetComponent<Animator>();
        playerRigidbody = GetComponent<Rigidbody>();
    }
 
    void Update()
    {
        //每帧获取玩家输入的虚拟轴,水平垂直值
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
 
        // 根据水平垂直输入量移动玩家
        Move(h, v);
 
        //旋转玩家
         
        //特别注意下面这个地方,这一句我想了一个晚上
        //因为h与v是GetAxias(),它的值从0到1,是连续量
        //问题就出在这里,当键盘抬起时,h和v会从原来的值逐渐回到0
        //所以角度也会转回去
        if(h!=0||v!=0)  
        {
            Rotating(h, v);
        }
 
        // 根据输入的值播放相应状态动画
        Animating(h, v);
    }
 
    void Move(float h, float v)
    {
        //根据输入的虚拟轴值设置变量
        movement.Set(h, 0f, v);
 
        // 单位化位移向量并根据速度得到需要移动的向量
        movement = movement.normalized * speed * Time.deltaTime;
 
        // 根据移动向量 移动玩家到相应位置
        playerRigidbody.MovePosition(transform.position + movement);
    }
 
    void Animating(float h, float v)
    {
        // 获取是否有唯一的bool
        bool walking = (h != 0f) || (v != 0f);
 
        //设置对应状态机的值
        anim.SetBool("IsWalking", walking);
    }
     
    void Rotating(float hor, float ver)
     {
         //获取方向
         Vector3 dir = new Vector3(hor, 0, ver);
         //将方向转换为四元数
         Quaternion quaDir = Quaternion.LookRotation(dir, Vector3.up);
        //缓慢转动到目标点
        Quaternion newRotation = Quaternion.Lerp(transform.rotation, quaDir, Time.deltaTime * 3.0f);
        // 更新刚体旋转值为 新旋转值
         playerRigidbody.MoveRotation(newRotation);
    }
}

回复 支持 反对

使用道具 举报

5熟悉之中
848/1000
排名
3594
昨日变化
3

0

主题

226

帖子

848

积分

Rank: 5Rank: 5

UID
144229
好友
0
蛮牛币
1302
威望
0
注册时间
2016-4-1
在线时间
242 小时
最后登录
2018-8-16
发表于 前天 16:20 | 显示全部楼层
阿莱克斯 发表于 2018-8-10 15:12
关于人物移动和使用四元数的平滑旋转(超级无敌改进版,比网上的好用)
[mw_shl_code=csharp,true] ...

谢谢楼主, 学习了

回复 支持 反对

使用道具 举报

7日久生情
2626/5000
排名
2720
昨日变化
4

0

主题

1867

帖子

2626

积分

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

UID
185339
好友
0
蛮牛币
3822
威望
0
注册时间
2016-11-20
在线时间
267 小时
最后登录
2018-8-16
发表于 14 小时前 | 显示全部楼层

回复

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表