【Ruby 2D】【unity learn】控制敌人随机运动以及动画控制

简介: 【Ruby 2D】【unity learn】控制敌人随机运动以及动画控制

前两天考完蓝桥杯稍微休息了一下,昨天做了一个动画控制,但是想到写出来可能会字很多,我就搁置到今天来写了,unity learn是一个官方教程平台,里面有unity assert store的配套教程,全是文档,比看视频高效太多了,想学习unity的可以去这里学习



网址


unity learn:Unity3d 教程 | Unity 中文课堂 (u3d.cn)


unity assert store:Unity 资源商店 - 优质3D 2D游戏制作资源平台


人物的移动已经做过了,大概就是修改transform组件的position属性,即坐标,enemy


27d9ac7e921146d2a8b6b67c7d7f37c5.png


我们场景中现有一个敌人对象

现在我们给它添加自由移动的脚本

然后它就会到处乱跑了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyEnemyController : MonoBehaviour
{
    public float Speed = 0.1f;
    public bool vertical;//是否垂直方向
    public float changeTime = 3.0f;//剩余改变时间
    Rigidbody2D Rd;
    float timer;
    int direction = 1;
    private float _timer = 0f;
    // Start is called before the first frame update
    void Start()
    {
        Rd = GetComponent<Rigidbody2D>();//获取刚体组件
        timer = changeTime;//改变方向的剩余时间
    }
    // Update is called once per frame
    private void Update()
    {
        timer -= Time.deltaTime;//deltaTime为Updata每一帧的时间
        if(timer < 0)
        {
            direction = -direction;//方向取反方向
            timer = changeTime;//再次开始计时
        }
    }
    void FixedUpdate()
    {
        float dt = Time.fixedDeltaTime;//跟上面的deltaTime同理
        _timer -= dt;//
        if (_timer < 0)
        {
            _timer = Random.Range(0.3f, 2.0f);
            vertical = !vertical;//垂直与水平相互换
        }
        Vector2 position = Rd.position;
        if (vertical)
        {
            position.y = position.y + Time.deltaTime * Speed * direction;//垂直修改y
        }
        else
        {
            position.x = position.x + Time.deltaTime * Speed * direction;//水平修改x
        }
        Rd.MovePosition(position);//MovePosition:导入一个vector向量来修改当前position位置
    }
}

3.png链接


Ruby

然后就是动画部分,不得不说,这一部分东西有点多。

首先,我们要把四个机器人移动的动画做出来,使用的是unity window窗口的animation工具

路径是 window->Animation->Animation

然后我们选中我们的enemy预制件





684afe4dcd6b4b64a7254ac0cc8a40d5.png





8ac6949b9d4e4024a23554d234a74fae.png

这个窗口会出现create按钮

点击create然后保存,建议建一个单独的文件夹

然后按住shift选中动画中需要插入的图片(这里的是assert提供的已经画好了的,所以直接用就行了)



cb89a8a4cd6c416f810d35b2a867d6fd.png


然后拖到Add Property按钮这里,unity会自动为你排列好动画

点击预览可查看,注意这里Samples要调低一点,没有Samples的要在右边的三个点这里点击 show Samples

a3fbaceb5d5b4cf0bc5038658f91dcc9.png



然后上走下走如法炮制即可,右走可以通过左走镜像得到

方法是点击Add Property按钮展开点击 Flip X,反转X轴



b2b8b4b04f804d7a94fa255b1df0f052.png

动画制作好后我们要制作动作树,这个机器人的比较简单,只要一个树就行了,涉及到主角的时候会有一堆动作的衔接,还挺多的

给你们个图自己体会一下


38a4b151ffd34d229322bc763d4c8096.png

机器人的就没这么麻烦

我们一开始会看到四个动作

ee1b20511f694e3ca2f2c043117ddf95.png


全部删掉

然后右键,Create State->from new Blend Tree

建好以后,我们点击Inspector的Motion下面的加号


e2358347a4ee45aab610cf84d2f07fb8.png


把做好的动作拖入这里

再对角色进行控制,就是检测到坐标的变化,然后播放相应的动画,向X轴左移动就x-1,其他以此类推即可

同时我们Parameter栏这里我们要确定好两个参数名,可以用MoveX和MoveY




c172fc4dd5aa4ad795ecb3bd643a6424.png


点击加号添加,然后右边的Parameter调用就行


东西都准备好了


我们为enemy对象来添加Animator 组件然后再写代码控制动画播放即可


在此之前我们要在文件夹建立一个Animation controller文件,并命名为Robot


再添加到enemy对象中的Animator组件中

2df5168e04414bac99f6a8db9fafd23e.png



b58da3cea91247bf9e00b1ef7ad6ea39.png


再之后就是代码环节了

代码环节就是通过Animator.SetFloat方法来改变刚才Parmeters中的两个属性来改变动画的播放

4.png

核心就这么几行代码
private Animator animator;//定义Animator对象
animator.SetFloat("MoveX", 0);//上两行垂直移动,下两行水平移动,原理是修改参数来控制动画
animator.SetFloat("MoveY", direction);
animator.SetFloat("MoveX",direction );
animator.SetFloat("MoveY",0 );
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyEnemyController : MonoBehaviour
{
    public float Speed = 0.1f;
    public bool vertical;
    public float changeTime = 3.0f;
    Rigidbody2D Rd;
    float timer;
    int direction = 1;
    private float _timer = 0f;
    private Animator animator;
    // Start is called before the first frame update
    void Start()
    {
        Rd = GetComponent<Rigidbody2D>();
        timer = changeTime;
        animator = this.GetComponent<Animator>();
    }
    // Update is called once per frame
    private void Update()
    {
        timer -= Time.deltaTime;
        if(timer < 0)
        {
            direction = -direction;
            timer = changeTime;
        }
    }
    void FixedUpdate()
    {
        float dt = Time.fixedDeltaTime;
        _timer -= dt;
        if (_timer < 0)
        {
            _timer = Random.Range(0.3f, 2.0f);
            vertical = !vertical;
        }
        Vector2 position = Rd.position;
        if (vertical)
        {
            position.y = position.y + Time.deltaTime * Speed * direction;
            animator.SetFloat("MoveX", 0);
            animator.SetFloat("MoveY", direction);
        }
        else
        {
            position.x = position.x + Time.deltaTime * Speed * direction;
            animator.SetFloat("MoveX",direction );
            animator.SetFloat("MoveY",0 );
        }
        Rd.MovePosition(position);//MovePosition:导入一个vector向量来修改当前position位置
    }
    void OnCollisionEnter2D(Collision2D other)
    {
        MyRubyController player = other.gameObject.GetComponent<MyRubyController>();
        if (player != null)
        {
            player.ChangeHealth(-1);
        }
    }
}


敌人的就这么多了,主角的比较复杂,有左待机右待机等一系列动作,再然后就是左受击右受击,左发射右发射等等,方向也是跟用户输入挂钩,工作量有点大不过跟敌人大体差不多,这里就不一一赘述了

最后成果如下



98f564741fd34c42876dc2f662243df8.gif











相关文章
|
4月前
|
C# 图形学
【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)
【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)
165 1
|
4月前
|
图形学 iOS开发
Unity——动效与缓动动画
Unity——动效与缓动动画
|
4月前
|
人工智能 算法 图形学
Unity 动画系统基本概念
Unity 动画系统基本概念
|
10月前
|
存储 图形学 Android开发
【游戏开发】使用unity创建2D游戏
Unity是一种非常强大的游戏引擎,可以帮助你创建各种类型的游戏,包括2D游戏。在本文中,我们将教你如何使用Unity创建2D游戏。首先,你需要确保你已经下载并安装了最新版本的Unity。如果你还没有安装Unity,可以从官方网站下载免费的Unity Hub来管理你的Unity版本。
388 0
|
10月前
|
前端开发 定位技术 图形学
【Ruby 2D】【unity learn】抬头显示血条
【Ruby 2D】【unity learn】抬头显示血条
|
10月前
|
机器人 图形学 Ruby
【unity learn】【Ruby 2D】角色发射飞弹
【unity learn】【Ruby 2D】角色发射飞弹
|
10月前
|
图形学 Ruby
【unity learn】【Ruby2D】控制人物运动的两套模式
【unity learn】【Ruby2D】控制人物运动的两套模式
【unity learn】【Ruby2D】控制人物运动的两套模式
|
4月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
50 0
|
4月前
|
人工智能 自然语言处理 区块链
【Unity 3D】元宇宙概念、应用前景、价值链等概述
【Unity 3D】元宇宙概念、应用前景、价值链等概述
52 0
|
4月前
|
vr&ar C# 图形学
【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)
【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)
38 0