zoukankan      html  css  js  c++  java
  • [开发ing] Unity项目

    目录

    游戏原型

    - 游戏介绍:这是一款横版类魂游戏,玩家将操控Hero,在诸神黄昏的墓地中,挑战源源不断的敌人,以及近乎无敌的强大boss - 灵感来源:源自itch中小游戏 [grave - uheartbeast](https://uheartbeast.itch.io/grave),区别于它无尽模式刷怪积分排名模式,在沿用其美术风格同时,我另加入操作性更好的角色Hero,以及更加强大、复杂多变的Boss,使战斗不仅仅局限于地面。此外b站UP主吾名白鼯的[迪亚波罗boss战](https://www.bilibili.com/video/av69859006?from=search&seid=10003432912367228336)也给予了我很多灵感 - 操作指南: - 移动:AD - 跳跃:W + Space - 滑铲躲避:S + Space - 攻击:鼠标左键

    项目演示

    Github项目地址:[Hero - SouthBegonia](https://github.com/SouthBegonia/UnityWorld/tree/master/Hero) 游戏试玩下载(提取码:wekp):[](https://pan.baidu.com/s/1YhGINK1zqLKmD6bp1C29tA)

    绘图资源

    - 场景:背景层采用视差滚动搭建,地面采用Tilemap绘制 - 角色:Hero、Boss、多简单敌人 - UI:玩家血量、Boss血量、击杀数

    代码实现

    - 游戏逻辑 - 事件消息 - UI交互 - 场景切换

    技术探讨

    多连击的实现

    本例中的Hero攻击动作分为地面三连击和空中三连击,实现多连击的过渡,关键在于动画判定、切换条件、切换时机

    • 动画判定:判定当前动画是哪个,进行了多少
    //创建动画机状态信息器
    private AnimatorStateInfo stateInfo;
    
    //Update内更新取得当前动画信息
    stateInfo = animator.GetCurrentAnimatorStateInfo(0);
    
    //判断正在播放的动画是否为attack_1,返回bool
    stateInfo.IsName("attack_1")
    
    //表示当前动画已经播放了多少进度,float型,范围 (0~1],例如0.5表示播放了一半
    stateInfo.normalizedTime
    
    //项目示例:
    //判断当某一攻击动画播放完毕,则重置攻击参数attack为0
    if ((stateInfo.IsName("attack_1") || stateInfo.IsName("attack_2") || stateInfo.IsName("attack_3")) && stateInfo.normalizedTime > 1f)
    {
    	count = 0;
    	animator.SetInteger("attack", count);
    	//...
    }
    
    • 切换条件:体现在例如attack_1仅能从idle状态下切换,attack_2仅能从attack_1切换等,这一部分可完全由动画状态信息器判定;此外还诸如跳跃仅能在地面上且非攻击状态实现、空中攻击仅能在空中实现等等,可由多bool类型值配合Input读取实现
    //项目示例:
    //多连击切换:
    if (count == 0)
    {
    	//攻击阶段一: idle ---> attack_1
    	count = 1;
    	animator.SetInteger("attack", count);
    }
    else if (stateInfo.IsName("attack_1") && count == 1)
    {
    	//攻击阶段二: attack_1 ---> attack_2
    	count = 2;
    	animator.SetInteger("attack", count);
    }
    else if (stateInfo.IsName("attack_2") && count == 2 && stateInfo.normalizedTime > 0.2f)
    {
    	//攻击阶段三: attack_2 ---> attack_3
    	count = 3;
    	animator.SetInteger("attack", count);
    }
    
    //各类状态的结构体:
    public struct PlayerState
    {
        public bool canInput;		 //是否能输入
        public bool canTurn;		 //是否能转向
        public bool canAttackAgain;  //是否能再次攻击
        public bool canJump;		 //是否能跳跃
        public bool canSlide;		 //是否能滑铲
    
        public bool isAttacking;     //是否处于攻击状态
        public bool isOnGround;      //是否在地面上
    }
    
    • 切换时机:主要体现在Animator中Translation面板对于两动画的切换过渡情况(Translation长度、前后标记)、切换方式(是否开启hasExitTime),以及代码控制(当即调用animator.SetInteger()还是在动画内插入时间)。此处较为重要,攻击的连贯性、复杂动作切换的可靠性都依赖于次。关于动画Translation切换过渡问题可移步博主拙作 HasExitTime用法 - SouthBegonia,此处不做详细说明,仅放出本项目Hero的Animator示意图,具体参数可查看项目内设置:

    硬直的实现

    本项目中硬直的主要体现在hero的空中三连击,最后一击为向下劈斩动作(attack_air_3),接触地面后再播放范围攻击特效(attack_air_4)。普通情况下hero跳跃到空中然后落地,该过程需要落地后立即切换到idle状态,但区别于普通情况,该空中三连击劈砍到地面后我们要保证该特效播放完整,因此需要引入硬直时间

    //项目示例:
    if (stateInfo.IsName("attack_air_3") && state.isOnGround)
    {
    	//待attack_air_3持续进行直至接触地面,自动切换到attack_air_4
    	//对attack_air_4进行动画延时结束,从而实现硬直
    	StartCoroutine(Attck_3CD());
    }
    
    IEnumerator Attck_3CD()
    {
    	//硬直期间禁止Input或其他...
    
    	//留给attack_air_4的播放时间 == 硬直时间
    	yield return new WaitForSeconds(0.5f);
    
    	//复位attack,整套动作完毕
    	count = 0;
    	animator.SetInteger("attack", count);
    }
    

    参考

    - 美术资源: - [Animated Pixel Adventurer - rvros](https://rvros.itch.io/animated-pixel-hero) - [animated-pixel-knight - rvros](https://rvros.itch.io/animated-pixel-knight) - [grave - uheartbeast](https://uheartbeast.itch.io/grave) - 灵感来源: - [grave - uheartbeast](https://uheartbeast.itch.io/grave) - [迪亚波罗,今天的老板是被当成boss打死的 - 吾名白鼯](https://www.bilibili.com/video/av69859006?from=search&seid=10003432912367228336) - 相关技术: - [什么是视差滚动 - indieNova](http://m.sohu.com/a/203140785_485902) - [Unity WVParallax 2D 视差效果组件 - 微维WEIVA](http://www.weiva.com/archives/674) - [Unity2D实现人物三连击 - 逐影](https://www.cnblogs.com/undefined000/p/unity2D-combo-attack.html)
  • 相关阅读:
    正则表达式分类
    数据思维二三事
    关于编程语言的一些趣史
    重构后端模板文件的一种实践
    为什么程序员需要知道互联网行业发展史
    探秘JS的异步单线程
    Nerd的畅销产品
    Nerd的套现ATM机
    网络传输与加密 (2)
    网络传输与加密
  • 原文地址:https://www.cnblogs.com/SouthBegonia/p/11872381.html
Copyright © 2011-2022 走看看