【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











相关文章
|
2月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
135 6
|
1月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
107 3
|
2月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
74 0
|
2月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
69 0
|
2月前
|
图形学
Unity动画☀️Unity动画系统Bug集合
Unity动画☀️Unity动画系统Bug集合
|
3月前
|
机器学习/深度学习 人工智能 算法
|
4月前
|
图形学
【unity小技巧】受伤屏幕闪红、死亡动画、死亡黑屏效果
【unity小技巧】受伤屏幕闪红、死亡动画、死亡黑屏效果
131 2
|
4月前
|
人工智能 定位技术 图形学
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
122 1
|
4月前
|
图形学
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
74 0
|
4月前
|
图形学
【unity小技巧】FPS简单的射击换挡瞄准动画控制
【unity小技巧】FPS简单的射击换挡瞄准动画控制
28 0