Unity 2D视角下模拟3D环境和地形

这篇具有很好参考价值的文章主要介绍了Unity 2D视角下模拟3D环境和地形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2D游戏若想模仿3D游戏的环境,一种很好的方案便是“2.5D”。

所谓2.5D,通常的理解是相机固定俯视的游戏视角。在此视角下,人物可以在x、y、z三个轴上移动,如此便能模仿3D游戏的环境,而美术成本要比3D低很多。

2.5D具体实现的方式也分多种,如2D角色+3D场景、3D角色+2D场景贴图、2D角色+2D场景贴图。此文章讨论对象为最后一种,由于角色和场景都采用2D图片,所以本质仍可以归为2D游戏。

Demo演示:

unity2d地形,unity,3d,游戏引擎,游戏程序,c#

Vector3 v3=new Vector3();
float pi=3.14159265f;
float pi_180=pi/180;
if(performer!=null)
{
    v3[0] = ((float)x);//和本体相同
    v3[1] = ((float)(Mathf.Cos(30 * pi_180)*y+Mathf.Sin(30 * pi_180)*z));//将三维坐标映射给二维贴图,其中30是根据2D图片假设的相机角度,pi_180是将角度转换成弧度进行计算。
    v3[2] = ((float)z*0.01f);//用于控制遮挡顺序,和本体成正比即可
    performer.transform.position=v3;
}

unity2d地形,unity,3d,游戏引擎,游戏程序,c#

此处采用了一种简单的方法:将人物本体(逻辑)和人物贴图(表现)分离,通过三角函数算出人物贴图在2D场景中的位置。

假设相机角度为α,人物贴图的位置为(x2,y2),人物逻辑的位置为(x,y,z),可知:

x2=x

y2=cos(α)*y+sin(α)*z

如此便在2D视角下模拟出了一个三维世界,而在此基础上,还可以利用unity本身的物理系统设计出3D地形,从而实现斜坡、拱桥等功能。效果图如下:

unity2d地形,unity,3d,游戏引擎,游戏程序,c#

unity2d地形,unity,3d,游戏引擎,游戏程序,c#

 由于人物本体仍处于3D空间中,因此可以直接在3D空间加入碰撞体来实现地形(可以看到碰撞体和贴图之间并不贴合,之后会解释原因)

unity2d地形,unity,3d,游戏引擎,游戏程序,c#

unity2d地形,unity,3d,游戏引擎,游戏程序,c#

那么要怎样根据2D贴图去制作碰撞体呢?之前有提到三维映射到二维的公式,那么反过来,从二维映射到三维也是可以的。但是二维上的一个点映射到三维会有无限种可能,直接套用公式并不可行,因此只能先假定y或z为一个固定值,通过另一值的变化量来计算相对坐标。

设相机角度为α,贴图的点位为(x2,y2),逻辑的点位为(x,y,z),一个格子为一个单位

unity2d地形,unity,3d,游戏引擎,游戏程序,c#如图,Δz=0,Δy2≈1.92 

套公式得Δy2=cosα*Δy+sinα*0,得y=y2/cosα,此时我设置的α为30°,所以Δy≈2.217

unity2d地形,unity,3d,游戏引擎,游戏程序,c#

 同理,得Δz≈5.688

 unity2d地形,unity,3d,游戏引擎,游戏程序,c#套用在碰撞体上即可

 可以发现映射后的y已经比二维上的y更大了,所以在二维视角下碰撞体和贴图并不贴合

unity2d地形,unity,3d,游戏引擎,游戏程序,c#

↑宽度测试,符合预期结果

unity2d地形,unity,3d,游戏引擎,游戏程序,c#

对于坡道的角度也要以同样的方式处理,三维坡角=二维坡角/cosα,此处相机角度为30°,坡道贴图的角度为15°,碰撞体的坡角即是17.32°。

拱桥则套用椭圆公式,x^2/a^2+ (y/cosα)^2/b^2 = 1

搭建好场景后,还需设置角色上坡和投射影子的逻辑,详情可看此篇文章:

Unity 对角色上坡的研究__独孤星夜_的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-735906.html

到了这里,关于Unity 2D视角下模拟3D环境和地形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity2d游戏项目--小狐狸

    (一) 在文件夹中找到back图片,并在检查器面板中将back图片的每单位像素数设置为16。 (文件所在地) (面板设置) (二) 将图片拖入到场景中 (一) 生成矩形的瓦片地图 (二) 打开平铺调色板 (三) 新建并命名为map,在原目录新建一个文件夹,用于存放你在这个瓦

    2024年02月03日
    浏览(30)
  • Unity2D小狐狸教程笔记

    下载 https://unity.cn/releases 默认显示方式 window - layout - default SampleScene : Project - 文件目录 Scene -游戏画面 asset store - 素材商店 在asset store下载素材 sunnyland shift + sapace 放大窗口 1.背景导入 每个格子16像素: Pixels Per Unit 16px 2.绘制瓷砖式地图 新建瓦片图层:左上角/右键 2D object

    2024年01月24日
    浏览(38)
  • Unity2D实现子弹追踪目标

    实现子弹追踪目标有很多种方法,首先是一开始就选定了目标的位置,然后按照曲线运动轨迹的方式,持续运动到目标点,不过如果目标移动了,就得将对应的轨迹重新计算一次,另外如果需要设置范围的话更不好做。另一种是锐角追踪,就是在目标进入识别范围后,将子弹

    2024年02月06日
    浏览(40)
  • Unity2D-使人物翻转的方法

    方法①:使用组件: SpriteRenderer 使用 GetAxis() 和 GetAxisRaw() 没有区别 方法②:使用组件: Transform 情况1:使用 GetAxisRaw() ;没有刹车效果,及翻转过程没有过渡, m o v e F a c t o r moveFactor m o v e F a c t or 取-1,1,0 情况1:使用 GetAxis() ;有刹车效果,及翻转过程有过渡, m o v e F a c t

    2024年02月12日
    浏览(28)
  • Unity2D子弹朝向鼠标位置发射

    废话不多说,先说明一下我使用的变量 float attack_time 用于表示每次攻击的间隙时间 float current_time 攻击时间的冷却 Rigidbody2D body 2D刚体组件 Object bomb 需要发射的物体对象 创建一枚子弹,unity的Instantiate()函数就可以实现,这里需要的三个参数是物体对象(Object),生成位置(Vecto

    2024年02月10日
    浏览(40)
  • Unity学习笔记(7) Unity2D骨骼动画制作流程

    用骨骼动画最大的好处就是方便之后做换装系统。 无论对3Dor2D游戏都是这样的。 这篇博文记录一下2D骨骼动画的制作流程,参考b站麦扣的系列教程: https://space.bilibili.com/370283072/channel/seriesdetail?sid=211996 用PS做一个将人物各个部件(骨骼)都分解开来的人物模型。 导出时注意

    2023年04月09日
    浏览(40)
  • unity2D横版游戏教程8-音效

    简单介绍一下unity audio,auido包括三个东西,分别是Aduio Listener,Audio Source,Audio Clips。Audio Listener就相当于耳朵,是用来听声音的,Audio Source就相当于播放器,一个音源,可以播放声音,具体播放什么声音就靠Audio Clips 通常Audio Listener只有一个,默认情况下Audio Listener就在Main

    2024年02月08日
    浏览(30)
  • 【Unity2D】相机移动以及设置相机边界

    添加相机时,首先需要在unity中添加 Cinemachine 包 第一次使用这个包时,需要在Package Manager中搜索并安装  安装Camera Mechine包后,添加2D Camera 设置跟随对象为Ruby (从Hierarchy中将Ruby拖动到Follow中)   同时,由于世界是有边界的,要为相机设置边界 通过添加Extension为相机添加

    2024年02月16日
    浏览(31)
  • Unity2D中让角色旋转朝向鼠标

       实现该功能,你需要关注以下的几个步骤 1.获取角色的世界坐标 2.获取鼠标所在位置的世界坐标 3.获取角色朝向鼠标时候的向量 4.获取上一步骤的向量的反正切的弧度值 5.将弧度值转化为角度 6.将该角度应用于角色 ——————————分割线——————————  

    2023年04月08日
    浏览(82)
  • 【Unity2d】Sprite Renderer精灵渲染器

           我们把游戏开发中的Sprite叫做精灵对象,简称精灵,就是游戏中的一个具有行为的元素。        创建精灵 (GameObject 2D Object Sprite) 时,Unity 会自动创建一个附加了 Sprite Renderer 组件的游戏对象。还可以通过 Components 菜单 (Component Rendering Sprite Renderer) 将该组件添加到

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包