Unity | 《小小英雄》曲面地图

开屏小广告:本人待业中,擅长 unity、cocos 开发,如各位大佬有岗位推荐,感激不尽

1. 效果预览

微信小游戏畅玩榜的《小小英雄》中战斗场景采用了开放式地图,玩家可自由移动,地图弯曲的设计区别于传统 2D 场景,仅用平面图片就实现了近大远小、地图弯曲的效果,增加了视觉吸引力

常规

常规

边界

边界

常规

常规

边界

边界

2. 地图拆解

游戏画面中,除了 UI 外,主要分为三个部分:

  • 地图:屏幕上半部分的地图呈曲面下沉

  • 装饰及角色:和地图表现一致

  • 远景:保持不变,当角色移动到边界时,可以呈现更多的远景

地图及其上的元素,规则都是距离摄像机越远下沉越多,且是非线性下沉,有明显的弧度,且具有前后遮挡关系

远景始终保持不变,当角色移动到地图尽头时,会呈现更多远景

地图拆解完毕后,接下来依次实现,先从最简单的远景做起

3. 地图实现

1. 远景

远景始终以固定的位置和角度展示在画面中,不会随着玩家移动而变化,但当玩家移动到地图尽头时,可以看到更多的远景。因此选择正交模式进行渲染,在 Hierarchy 中创建摄像机,将 Projection 选择为 Orthographic

该摄像机只渲染远景,所以将背景及摄像机的 Culling Mask 均设置为远景层:

远景层的展示效果:

ps: 主流设备的分辨率比例也不尽相同,为了在多种分辨率下都可以完整的显示背景,需要根据设备实际分辨率对相机的 orthographicSize 属性进行设置,核心代码如下:

switch (resolutionPolicy)
{
    case ResolutionPolicy.FixedWidth:
        float aspectRatio = Screen.width * 1.0f / Screen.height;
        orthoSize = designResolution.x / 100 / 2 / aspectRatio;
        break;
    case ResolutionPolicy.FixedHeight:
        orthoSize = designResolution.y / 100 / 2;
        break;
}

2. 地图及元素

地图及其上的元素距离摄像机越远,下沉弧度越大,即随着 Z 坐标的偏移增值大,元素 X、Z 坐标保持不变,Y 坐标根据 Z 坐标利用曲线公式,计算出下沉后的坐标值

在 Unity 中实现下沉坐标的计算有两种方式

  • Shader Graph

    【Unity教程】简单的世界弯曲效果(Shader Graph教程):https://www.bilibili.com/video/BV1Rr4y167ET/

  • Shader

    UnityShader 基础(23)-模型弯曲-地铁跑酷与动森地图:https://zhuanlan.zhihu.com/p/407402648

Shader 核心代码:

// 获取模型的空间坐标
float3 WordPos = mul(unity_ObjectToWorld, v.vertex);

// 获取 Y 轴坐标
o.WordData.x = WordPos.y;
// Y 轴扭曲,依据 Z坐标变化
WordPos.y -= pow(WordPos.z, 2) * _BendY;

// 修正模型位置,WordPos 不包含物体自身的空间位移
WordPos -= mul(unity_ObjectToWorld, float4(0, 0, 0, 1));

// 修改世界顶点转回物体自身顶点。
v.vertex = mul(unity_WorldToObject, WordPos);
// 转换为裁切空间
o.vertex = UnityObjectToClipPos(v.vertex);

根据此 Shader 创建材质,并将其应用到地图及元素,如果角色使用 Spine,也需要同步更改 Spine 的 Shader,通过在编辑器面板中调整参数,实现不同程度的弯曲效果

ps: demo 中的地图仅使用了一张纹理,实际项目的地图会丰富多彩,为了优化性能,可以采用多张纹理拼接的形式,根据坐标控制地图切块的显示、隐藏及加载、卸载

4. 角色移动

游戏是欺骗的艺术,游戏中控制角色移动也有两种方式

  • 控制角色在地图中的位置,地图位置固定,摄像机跟随角色移动

  • 控地图的位置,角色和摄像机位置固定

这里使用控制地图位置的方式,计算出地图边界后,当玩家操作摇杆时,更改地图坐标,并将其约束在边界内,核心代码:

var position = mapController.position;
Vector3 direction = Vector3.forward * joystick.Vertical + Vector3.right * joystick.Horizontal;
if (direction.x < 0)
{
    playerTrans.localScale = new Vector3(-0.3f, 0.3f, 0.3f);
}
else if (direction.x > 0)
{
    playerTrans.localScale = new Vector3(0.3f, 0.3f, 0.3f);
}

position += -direction * speed * Time.deltaTime;
position.x = Mathf.Clamp(position.x, -11, 11);
position.z = Mathf.Clamp(position.z, -13, 10);
mapController.position = position;

5. 源码说明

源码不包括分辨率适配,地图切块。仔细阅读教程,可独立实现该效果,无须付费购买

源码需费购买:https://weidian.com/item.html?itemID=7260900875

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的体育馆管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SpringBoot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系统;SpringBoot框架;Mysql;自动化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值