Ruby‘s Adventrue游戏制作笔记(十)Unity添加动画

17 篇文章 0 订阅
17 篇文章 1 订阅


前言

本文章是我学习Unity官方项目项目所做笔记,作为学习Unity的游戏笔记,在最后一章会发出源码,如果等不及可以直接看源码,里面也有很多注释相关,话不多说,让Ruby动起来!
游戏引擎:Unity2020.3

一、给食物添加动画

打开地图中的一个食物元素,点击windows-animation-animation
或者Ctrl + 6
在这里插入图片描述
帧数samples在右边打开

在这里插入图片描述
Create一个新的动画
创建缩放(放大缩小效果)
在这里插入图片描述
移动到0.1秒 放大
在这里插入图片描述
移动到0.2 复原
在这里插入图片描述
移动到0.3 缩小
在这里插入图片描述
移动到0.4 复原
完整动画完成,覆盖prefabs

二、给敌人添加动画

在这里插入图片描述
选择四个动画,直接拖入物体中
将下、左、上移动拖入后
由于向右运动就是向左运动的景象反转,所以先创建一个

在这里插入图片描述
在这里插入图片描述
将之前给向左移动的四个动画拖入新创建的动画中
添加一个flip X,进行水平方向上的反转

在这里插入图片描述
进入动画的controller
在这里插入图片描述
创建状态树
在这里插入图片描述
在这里插入图片描述
添加四个状态
在这里插入图片描述
将各种状态拖进来,改变各种属性
在这里插入图片描述
状态树为
在这里插入图片描述
将状态树设置为Layer Default State,删除其他动画
在这里插入图片描述
连线为
在这里插入图片描述
编辑蓝色箭头处,不用退出时间
在这里插入图片描述
增添和更改parameters中的trigger
在这里插入图片描述
设置状态树为MOVEX和moveY两个状态
在这里插入图片描述
修改脚本EnemyController
获取动画组件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、添加玩家动画

由于资源拥有玩家的动画,所以不一一添加了,如果没有,跟敌人的流程差不多
给Ruby一个Animator状态转换机
在这里插入图片描述
直接选择Ruby
在这里插入图片描述
稍微讲解一下
在这里插入图片描述
idle是平常保持的普通状态
蓝箭头这个状态转换
在这里插入图片描述
当Speed > 0.1时,发生状态的转换,转换为move状态
在这里插入图片描述
蓝箭头这个状态转换
在这里插入图片描述
当Speed < 0.1时,发生状态的转换,转化为普通状态

四、设置触发动画的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{

    // 玩家速度
    public float speed = 5f;

    // 玩家最大生命值
    private int maxHealth = 5;

    // 当前生命值
    private int currentHealth;

    // 受到伤害后的无敌时间 无敌时间2秒
    private float invincibleTime = 2f; 

    // 无敌计时器
    private float invincibleTimer;

    // 是否无敌
    private bool isInvincible;

    // 玩家的朝向信息
    // 默认朝向右方
    private Vector2 lookDirection = new Vector2(1, 0);

    private Animator anim;
   


    // 获得最大生命值
    public int myMaxHealth
    {
        get
        {
            return maxHealth;
        }
    }

    // 获得当前生命值
    public int myCurrentHealth
    {
        get
        {
            return currentHealth;
        }
    }

    // 获得玩家刚体
    private Rigidbody2D rbody;





    void Start()
    {
        currentHealth = 2;
        invincibleTimer = 0;
        // 获得玩家刚体
        rbody = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
       

        float moveX = Input.GetAxisRaw("Horizontal");  // 控制水平移动方向 按下A时返回 -1,按下D时返回 1
        float moveY = Input.GetAxisRaw("Vertical"); // 控制垂直方向 W:1 S:-1 

        // 改变朝向信息
        Vector2 moveVerctor = new Vector2(moveX, moveY);
        if(moveVerctor.x !=0 || moveVerctor.y != 0)
        {
            lookDirection = moveVerctor;
        }

        // 设置动画
        anim.SetFloat("Look X", lookDirection.x);
        anim.SetFloat("Look Y", lookDirection.y);
        // 根据向量大小判断
        anim.SetFloat("Speed", moveVerctor.magnitude);

        // 创建position坐标,存储玩家输入的坐标
        Vector2 position = rbody.position;
        // position.x += moveX * speed * Time.deltaTime;
        // position.y += moveY * speed * Time.deltaTime;

        //使用向量尝试
        position += moveVerctor * speed * Time.deltaTime;

        // 将最终坐标赋值给玩家
       // transform.position = position;

        // 使用刚体
        rbody.position = position;

        // 无敌计时
        if (isInvincible)
        {
            invincibleTimer -= Time.deltaTime;
            if (invincibleTimer < 0)
            {
                // 倒计时结束后取消无敌状态
                isInvincible = false;
            }
        }
    }


    // 改变玩家生命值
    public void ChangeHealth(int amount)
    {
        // 如果受到伤害,判断是否无敌
        if(amount < 0)
        {
            // 无敌,不执行
            if (isInvincible == true) return;

            // 不无敌,执行,并且设定为无敌状态
            isInvincible = true;
            invincibleTimer = invincibleTime;

        }

        Debug.Log(currentHealth + "/" + maxHealth);
        // 把玩家的生命值约束在 0 和 最大值 之间
   
        currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);
       

        //currentHealth += amount;
        Debug.Log(currentHealth + "/" + maxHealth);
    }
}


系列链接

Ruby‘s Adventrue游戏制作笔记(一)Unity创建项目

Ruby‘s Adventrue游戏制作笔记(二)Unity控制ruby移动

Ruby‘s Adventrue游戏制作笔记(三)Unity使用tilemap绘制场景

Ruby‘s Adventrue游戏制作笔记(四)Unity绘制其他元素

Ruby‘s Adventrue游戏制作笔记(五)Unity解决碰撞抖动和旋转问题

Ruby‘s Adventrue游戏制作笔记(六)Unity相机跟随玩家移动

Ruby‘s Adventrue游戏制作笔记(七)Unity采集生命道具

Ruby‘s Adventrue游戏制作笔记(八)Unity伤害陷阱

Ruby‘s Adventrue游戏制作笔记(九)Unity添加敌人

Ruby‘s Adventrue游戏制作笔记(十)Unity添加动画

Ruby‘s Adventrue游戏制作笔记(十一)Unity角色攻击——发射子弹

Ruby‘s Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效

Ruby‘s Adventrue游戏制作笔记(十三)Unity血条UI的显示

Ruby‘s Adventrue游戏制作笔记(十四)Unity播放游戏音效

Ruby‘s Adventrue游戏制作笔记(十五)UnityNPC对话

Ruby‘s Adventrue游戏制作笔记(十六)Unity子弹数量及其UI

Ruby‘s Adventrue游戏制作笔记(十七)Unity添加游戏胜利条件和失败条件和导出游戏

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C++和EasyX开发的走迷宫益智小游戏源码+项目说明.zip 【项目介绍】 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 版本:V1.0 时间:2020-7-22 环境:开始使用 VS2010,后来用 VS2017 修改 简介:一个普通的迷宫小游戏 感谢:感谢 QQ 群 C语言革命7 全体成员为该项目的开发做了巨大的贡献,没有你们,该作品也不能有现在的情况! 版权:作者原创,无抄袭,不涉及版权问题,仅用作学习、娱乐,欢迎各位fork! ### 玩法: ~~~cpp 游戏开始选择系列关卡 有三种系列: 森林(简单,基于 Prim 算法) 地牢(中等,基于图论 DFS 算法) 地狱(困难,基于暴力 DFS 算法) 选择系列后,进入游戏 WSAD 上下左右,游戏中有计时器 ~~~ ### 文件: ~~~cpp Maze.h : 初始化头文件 Maze.cpp : 程序开端文件 Game.h : 游戏类头文件 Adventrue.cpp : 冒险模式类文件 Forest.cpp : 冒险模式-森林系列类实现文件 Dungeon.cpp : 冒险模式-地牢系列类实现文件 Infernal.cpp : 冒险模式-地狱系列类实现文件 Help.cpp : 帮助信息类实现文件 Other.cpp : 刷新界面、放置按钮、输出对话框类实现文件 ~~~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值