找回密码
 注册帐号

扫一扫,访问微社区

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

10
回复
1297
查看
[ 复制链接 ]
排名
21326
昨日变化

6

主题

18

帖子

70

积分

Rank: 2Rank: 2

UID
292365
好友
1
蛮牛币
589
威望
0
注册时间
2018-8-3
在线时间
18 小时
最后登录
2018-9-26
2018-8-9 16:18:16 显示全部楼层 阅读模式

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

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

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(三十八)



回复

使用道具 举报

5熟悉之中
817/1000
排名
5757
昨日变化

9

主题

320

帖子

817

积分

Rank: 5Rank: 5

UID
285521
好友
0
蛮牛币
1413
威望
0
注册时间
2018-6-12
在线时间
236 小时
最后登录
2019-1-14
2018-8-9 19:48:19 显示全部楼层
谢谢分享哦,怪物模型也帅
回复 支持 反对

使用道具 举报

3偶尔光临
298/300
排名
6931
昨日变化

0

主题

47

帖子

298

积分

Rank: 3Rank: 3Rank: 3

UID
292147
好友
0
蛮牛币
917
威望
0
注册时间
2018-8-1
在线时间
61 小时
最后登录
2018-12-19
2018-8-9 20:07:04 显示全部楼层
66666666666
回复

使用道具 举报

7日久生情
1714/5000
排名
2263
昨日变化

0

主题

643

帖子

1714

积分

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

UID
182268
好友
2
蛮牛币
758
威望
0
注册时间
2016-11-9
在线时间
450 小时
最后登录
2019-4-22
2018-8-10 09:54:03 显示全部楼层
挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好挺好
回复 支持 反对

使用道具 举报

5熟悉之中
976/1000
排名
3457
昨日变化

2

主题

266

帖子

976

积分

Rank: 5Rank: 5

UID
144229
好友
0
蛮牛币
1374
威望
0
注册时间
2016-4-1
在线时间
276 小时
最后登录
2019-5-9
2018-8-10 11:17:36 显示全部楼层
谢谢楼主分享,我研究四元数也死了不少脑细胞
回复 支持 反对

使用道具 举报

7日久生情
1535/5000
排名
3443
昨日变化

0

主题

895

帖子

1535

积分

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

UID
210390
好友
0
蛮牛币
1835
威望
0
注册时间
2017-3-7
在线时间
206 小时
最后登录
2019-5-23
2018-8-10 14:20:06 显示全部楼层
回复

使用道具 举报

排名
21326
昨日变化

6

主题

18

帖子

70

积分

Rank: 2Rank: 2

UID
292365
好友
1
蛮牛币
589
威望
0
注册时间
2018-8-3
在线时间
18 小时
最后登录
2018-9-26
楼主 2018-8-10 15:12:06 显示全部楼层
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熟悉之中
976/1000
排名
3457
昨日变化

2

主题

266

帖子

976

积分

Rank: 5Rank: 5

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

谢谢楼主, 学习了
回复 支持 反对

使用道具 举报

8常驻蛮牛
5151/10000
排名
1669
昨日变化
1

0

主题

3682

帖子

5151

积分

Rank: 8Rank: 8

UID
185339
好友
1
蛮牛币
3599
威望
0
注册时间
2016-11-20
在线时间
691 小时
最后登录
2019-5-24
2018-8-16 09:26:01 显示全部楼层
回复

使用道具 举报

排名
39857
昨日变化

0

主题

57

帖子

79

积分

Rank: 2Rank: 2

UID
286498
好友
0
蛮牛币
48
威望
0
注册时间
2018-6-20
在线时间
16 小时
最后登录
2019-5-10
2018-9-4 12:59:18 显示全部楼层
学不会是真的
回复

使用道具 举报

0

主题

1

帖子

2

积分

Rank: 1

UID
266256
好友
0
蛮牛币
17
威望
0
注册时间
2018-1-25
在线时间
1 小时
最后登录
2018-12-17
2018-12-5 16:13:24 显示全部楼层
非常谢谢分享哦,怪物模型也帅
回复 支持 反对

使用道具 举报

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

本版积分规则