基于Unity3D如何实现3D照片墙效果
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,这篇文章主要介绍了基于Unity3D如何实现3D照片墙效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言Unity3D不仅仅可
千家信息网最后更新 2025年01月17日基于Unity3D如何实现3D照片墙效果
这篇文章主要介绍了基于Unity3D如何实现3D照片墙效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
一、前言
Unity3D不仅仅可以开发游戏,还有非常多的开发方向,秉承着兴趣为先,将可以使用Unity制作的各种应用案例,分享如何进行开发,如何实现,希望大家可以在感兴趣的地方,学习到自己想要学习的东西。
今天就来实现一个3D照片墙的效果。
我对于这个项目的构思就是照片是3D的,可以滑动,然后使用DoTween插件去做动画平滑移动。
OK,那就正式开始。
先看一下效果图:
二、正式开发
新建项目,我使用的版本是Unity3D 2019.4.7f1,模板选用3D:
(1)导入DoTween插件。
(2)新建Canvas,设置参数:
设置Canvas的坐标到0,0,0:
(3)在Canvas新建N个Image:
(4)设置Main Camera的属性:
设置完的样子:
反正就是让Image在屏幕中间就可以了。
(5)新建脚本UIRotate.cs,双击打开脚本,编辑代码:
using DG.Tweening;using UnityEngine;using UnityEngine.EventSystems;public class UIRotate : MonoBehaviour{ private int halfSize; private GameObject[] gameObjects; ////// 圆半径 /// private int r = 300; ////// 相间角度 /// private int angle; private void Start() { //初始化数组 var childCount = transform.childCount; //计算出中点 halfSize = (childCount - 1) / 2; //求出圆内角度 angle = 360 / childCount; //初始 gameObjects = new GameObject[childCount]; for (var i = 0; i < childCount; i++) { gameObjects[i] = transform.GetChild(i).gameObject; SetPosition(i); SetDeepin(i); } } ////// 设置物体位置 /// private void SetPosition(int index) { float x = 0; float z = 0; if (index < halfSize) { int id = halfSize - index; x = r * Mathf.Sin(angle * id); z = -r * Mathf.Cos(angle * id); } else if (index > halfSize) { int id = index - halfSize; x = -r * Mathf.Sin(angle * id); z = -r * Mathf.Cos(angle * id); } else { x = 0; z = -r; } Tweener tweener = gameObjects[index].GetComponent().DOLocalMove(new Vector3(x, 0, z), 1); } private void SetDeepin(int index) { //计算图片深度也就是z轴的距离,离摄像机的远近 int deepin = 0; if (index < halfSize) { deepin = index; } else if (index > halfSize) { deepin = gameObjects.Length - (1 + index); } else { deepin = halfSize; } gameObjects[index].GetComponent ().SetSiblingIndex(deepin); }}
(6)将UIRotate.cs脚本附到Canvas对象上,运行程序:
(7)添加左右拖动代码,继续修改UIRotate.cs代码:
using DG.Tweening;using UnityEngine;using UnityEngine.EventSystems;public class UIRotate : MonoBehaviour{ private int halfSize; private GameObject[] gameObjects; ////// 圆半径 /// private int r = 300; ////// 相间角度 /// private int angle; private void Start() { //初始化数组 var childCount = transform.childCount; //计算出中点 halfSize = (childCount - 1) / 2; //求出圆内角度 angle = 360 / childCount; //初始 gameObjects = new GameObject[childCount]; for (var i = 0; i < childCount; i++) { gameObjects[i] = transform.GetChild(i).gameObject; SetPosition(i); SetDeepin(i); } } ////// 设置物体位置 /// private void SetPosition(int index) { float x = 0; float z = 0; if (index < halfSize) { int id = halfSize - index; x = r * Mathf.Sin(angle * id); z = -r * Mathf.Cos(angle * id); } else if (index > halfSize) { int id = index - halfSize; x = -r * Mathf.Sin(angle * id); z = -r * Mathf.Cos(angle * id); } else { x = 0; z = -r; } Tweener tweener = gameObjects[index].GetComponent().DOLocalMove(new Vector3(x, 0, z), 1); } private void SetDeepin(int index) { //计算图片深度也就是z轴的距离,离摄像机的远近 int deepin = 0; if (index < halfSize) { deepin = index; } else if (index > halfSize) { deepin = gameObjects.Length - (1 + index); } else { deepin = halfSize; } gameObjects[index].GetComponent ().SetSiblingIndex(deepin); } /// /// 向左滑动 /// public void OnLeftDrag() { var length = gameObjects.Length; for (var i = 0; i < length; i++) { var temp = gameObjects[i]; gameObjects[i] = gameObjects[length - 1]; gameObjects[length - 1] = temp; } for (var i = 0; i < length; i++) { SetPosition(i); SetDeepin(i); } } ////// 向右滑动 /// public void OnRightDrag() { var length = gameObjects.Length; for (var i = 0; i < length-1; i++) { var temp = gameObjects[i]; gameObjects[i] = gameObjects[i+1]; gameObjects[i+1] = temp; } for (var i = 0; i < length; i++) { SetPosition(i); SetDeepin(i); } } private Vector2 touchFirst = Vector2.zero;//手指开始按下的位置 private Vector2 touchSecond = Vector2.zero;//手指拖动的位置 void OnGUI() { if (Event.current.type == EventType.MouseDown) { touchFirst = Event.current.mousePosition;//记录开始按下的位置 } if (Event.current.type == EventType.MouseUp) { touchSecond = Event.current.mousePosition;//记录拖动的位置 if (touchSecond.x < touchFirst.x) { OnLeftDrag();//向左滑动 } if (touchSecond.x > touchFirst.x) { OnRightDrag();//向右滑动 } touchFirst = touchSecond; } }}
运行程序:
(8)导入照片最后试一下:
感谢你能够认真阅读完这篇文章,希望小编分享的"基于Unity3D如何实现3D照片墙效果"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
位置
照片
效果
篇文章
角度
开发
代码
兴趣
脚本
学习
中点
也就是
半径
图片
就是
手指
插件
摄像机
数组
深度
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
游戏公司服务器放哪
页面部署到服务器 下面一行乱码
网站会读取什么数据库
智理未来网络安全线上峰会
网络安全技术发展快速
无云斋神秘事件数据库
萤石云上面有几个服务器
安徽点亮网络技术有限公司
加强网络安全自律
如何利用量子算法搜索数据库
服务器pcie网卡推荐
泰拉瑞亚手机服务器
园区网络安全攻击案例
软件开发是正规的吗
云服务器如何清除木马文件
网络技术ip定义
时空网络技术
软件开发企业成本有那些
公司的网络安全是谁的责任
maven迁移新服务器
黄浦区品质软件开发供应商
数据库关键字搜索技术
数据库中包括学生
电脑修改串口服务器ip
技术创新 提升网络安全防护
网络安全宣传网贷
数据库 5120
服务器pcie网卡推荐
dellt320服务器怎么样
丽江新华互联网科技收费