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;
此处采用了一种简单的方法:将人物本体(逻辑)和人物贴图(表现)分离,通过三角函数算出人物贴图在2D场景中的位置。
假设相机角度为α,人物贴图的位置为(x2,y2),人物逻辑的位置为(x,y,z),可知:
y2=cos(α)*y+sin(α)*z
如此便在2D视角下模拟出了一个三维世界,而在此基础上,还可以利用unity本身的物理系统设计出3D地形,从而实现斜坡、拱桥等功能。效果图如下:
由于人物本体仍处于3D空间中,因此可以直接在3D空间加入碰撞体来实现地形(可以看到碰撞体和贴图之间并不贴合,之后会解释原因)
那么要怎样根据2D贴图去制作碰撞体呢?之前有提到三维映射到二维的公式,那么反过来,从二维映射到三维也是可以的。但是二维上的一个点映射到三维会有无限种可能,直接套用公式并不可行,因此只能先假定y或z为一个固定值,通过另一值的变化量来计算相对坐标。
设相机角度为α,贴图的点位为(x2,y2),逻辑的点位为(x,y,z),一个格子为一个单位
如图,Δz=0,Δy2≈1.92
套公式得Δy2=cosα*Δy+sinα*0,得y=y2/cosα,此时我设置的α为30°,所以Δy≈2.217
同理,得Δz≈5.688
套用在碰撞体上即可
可以发现映射后的y已经比二维上的y更大了,所以在二维视角下碰撞体和贴图并不贴合
↑宽度测试,符合预期结果
对于坡道的角度也要以同样的方式处理,三维坡角=二维坡角/cosα,此处相机角度为30°,坡道贴图的角度为15°,碰撞体的坡角即是17.32°。
拱桥则套用椭圆公式,x^2/a^2+ (y/cosα)^2/b^2 = 1
搭建好场景后,还需设置角色上坡和投射影子的逻辑,详情可看此篇文章:
Unity 对角色上坡的研究__独孤星夜_的博客-CSDN博客
我是从cocos2d 转移阵营过来的 unity下开发2d游戏真是不习惯。。。特别是2d中有许多特性是非常必要的,但是unity本身又支持得非常烂的...所以这时候就要用过第3方插件,我试过EZGUI, sm2,gm2,还有一个忘了名字的2d插件,但是都不符合我的要求,在我百无聊赖中终于看见了它——OrtHello ——>_
好吧,我搜了一遍几乎没有OrtHello 的中文教材,连英文的
现在来做点别的东西。Nintendo Switch上刚推出的《超级马里奥》中,有一些关卡混合了2D和3D的画面,这种效果十分让人印象深刻。如何在Unity中实现这个效果呢?
正常情况下,摄像机会直接渲染到你的屏幕。我们如何能让摄像机看到内容并显示在另一个对象上呢?你可能注意到摄像机有一个属性,叫目标纹理(Target Texture)。
我们要在Asset文件夹里新建一个渲...
基于Unity的全景图制作伪3D场景的测试
公司想用拍照设备拍出的全景图,在Unity中制作成VR的场景,先抛开VR不谈,如果想用图片来实现3D场景的感觉,就必须得先创建一个3D模型,然后把全景图无缝衔合上去。想必大家都想到了unity中天空盒的原理,话不多说,直接上实现过程。
一、在Unity中创建一个Sphere,这也将是我们全景图的载体。
二、为Sphere赋予shader,此sha...
正所谓 金三银四 ,又到了找工作的大好时机了,不知道大家有没有意向找一份更好的工作呢~
之前写了很多Unity的学习和实例文章,但是面试题部分还没有一个系统的整理。
那本篇文章就来整理一下Unity中一些常见的面试题,说不准就会面试的时候就会遇到!
本篇文章会将Unity所有方面的面试资料都融会贯通,绝对是2022年Unity面试领域最实用的文章啦!