目录

游戏原型

- 游戏介绍:这是一款横版类魂游戏,玩家将操控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)

[开发ing] Unity项目 - Hero英雄的更多相关文章

  1. Unity项目开发过程中常见的问题,你遇到过吗?

    最近看到有朋友问一个unity游戏开发团队,需要掌握哪些知识之类的问题.事实上Unity引擎是一个很灵活的引擎,根据团队开发游戏类型的不同,对人员的要求也有差异,所以不能一概而论.但是,一些在Unit ...

  2. 使用Slua框架开发Unity项目的重要步骤

    下载与安装 下载地址 GitHub 安装过程1.下载最新版,这里, 解压缩,将Assets目录里的所有内容复制到你的工程中,对于最终产品,可以删除slua_src,例子,文档等内容,如果是开发阶段则无 ...

  3. HoloLens开发手记 - Unity development overview 使用Unity开发概述

    Unity Technical Preview for HoloLens最新发行版为:Beta 24,发布于 09/07/2016 开始使用Unity开发HoloLens应用之前,确保你已经安装好了必 ...

  4. HoloLens开发手记 - Unity之Spatial mapping 空间映射

    本文主要讨论如何在Unity项目中集成空间映射功能.Unity内置了对空间映射功能的支持,通过以下两种方式提供给开发者: HoloToolkit项目中你可以找到空间映射组件,这可以让你便捷快速地开始使 ...

  5. Unity学习笔记(二)——第一个Unity项目Hello Unity

    保留版权,转载请注明出处:http://blog.csdn.net/panjunbiao/article/details/9318811 在这一篇文章里,参照宣雨松的<Unity 3D游戏开发& ...

  6. 承接Unity外包 U3D外包 Unity3D外包 小型Unity项目外包用Unity还是UE4

    转自mobilehub公众号(ID: mobilehub),作者:屠敏 VR浪潮席卷而来,相对于资本的狂热,现实中真正需要的是有实力的VR硬件研发团队和专业内容制作队伍.对于入门级的开发者而言,游戏引 ...

  7. Unity项目中的资源管理

    这是我在2017金山技术开放日分享的部分内容.从贴图资源格式配置的介绍开始,引申出资源配置工具,最后再谈谈一整套项目资源管理方案.在GitHub上可以获取到资源配置工具的代码,是基于下面理念的一份简单 ...

  8. 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术

    [Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...

  9. 现学现卖】IntelliJ+EmmyLua 开发调试Unity中Xlua

    http://blog.csdn.net/u010019717/article/details/77510066?ref=myread http://blog.csdn.NET/u010019717 ...

随机推荐

  1. GoCN每日新闻(2019-11-07)

    GoCN每日新闻(2019-11-07) GoCN每日新闻(2019-11-07) 1. [译] 排序运行时间能否做到 O(n)?让 Go 语言来告诉你 https://mp.weixin.qq.co ...

  2. 模拟26A 题解

    A. marshland 考试时想到了网络流,然而不会建图,就死了. 正解是最大费用可行流. 比较容易想到的是将每个点拆为两个点, s连没有危险值的入点, 没有危险值的入点连有危险值的入点,入点出点之 ...

  3. fastjson WriteClassName,Double类型不打3.3D

    方式一: public class SerializeConfigX extends SerializeConfig { public SerializeConfigX() { put(Double. ...

  4. javascript的Map使用

    setExpenseAndAmountSum: function() { var detailList = vehicleVueObj.vehicleData; var expenseAmountSu ...

  5. Asynchronous method in while loop 构造异步调用链

    Asynchronous method in while loop https://stackoverflow.com/questions/43064719/javascript-asynchrono ...

  6. springboot装配OkHttp组件

    在SpringBoot应用中,发送Http通常我们使用RestTemplate,但有部分组件底层是使用OkHttp进行Http的操作,而且OKHttp也是一个很优秀的HTTP组件. RestTempa ...

  7. SearchLookupEdit 选择后联动

    直接改绑定数据源--实体的属性会导致选择内容变空 所有改相应控件的text然后再写入数据源 最好将需要联动的控件设置成只读 mNoTextEdit.EditValueChanged += (s, e) ...

  8. 【Python】解析Python中函数的基本使用

    1.简介 在Python中定义函数的基本格式为: def <函数名>(参数列表): <函数语句> return <返回值> Python中的函数形式比较灵活,声明一 ...

  9. what's the psutil模块

    what's the psutil模块 psutil 是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要用来做系统监控,性能分析,进程管理.它实现 ...

  10. android文件分享在android7.0以上版本报错的解决方案

    最近在使用蓝牙进行文件分享时,出现了一个奇怪的问题.同样的代码在android5.1上可以顺利运行,但是在android7.0上就运行失败.出现如下的错误: Caused by: android.os ...