推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客
  • QQ群:1040082875

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

首先,介绍一波我这个专栏:Unity3D之Unity应用案例

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;/// <summary>/// 圆半径/// </summary>private int r = 300;/// <summary>/// 相间角度/// </summary>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);}}/// <summary>/// 设置物体位置/// </summary>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<RectTransform>().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<RectTransform>().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;/// <summary>/// 圆半径/// </summary>private int r = 300;/// <summary>/// 相间角度/// </summary>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);}}/// <summary>/// 设置物体位置/// </summary>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<RectTransform>().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<RectTransform>().SetSiblingIndex(deepin);}/// <summary>/// 向左滑动/// </summary>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);}}/// <summary>/// 向右滑动/// </summary>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照片墙,虽然效果出来了,但是想要实现更加美观的效果还需要一些努力。

源代码就放在CSDN吧:
https://download.csdn.net/download/q764424567/84045547

你的点赞就是对博主的支持,有问题记得留言:

博主还有跟多宝藏文章等待你的发掘哦:

专栏 方向 简介
Unity3D开发小游戏 小游戏开发教程 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶 入门 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUI UGUI Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据 文件读取 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合 数据集合 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发 虚拟仿真 总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件 插件 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发 日常记录 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG 日常记录 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

【Unity3D应用案例系列】Unity3D中实现《3D照片墙》相关推荐

  1. 【Unity3D应用案例系列】专栏文章导读清单

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 凡事总是有有点兴趣才会去做的对嘛,我已经有一个专栏去分享小游戏的开 ...

  2. 【Unity3D应用案例系列】Unity3D中实现抽奖功能

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 本博文标题和内容参考: 被黑心商家坑了N次,探究抽奖背后的秘密 - ...

  3. 【Unity3D应用案例系列】答题系统开发

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 这是本专栏系列的第一篇,答题系统的开发. 这个答题系统,可以从文本 ...

  4. 【Unity3D应用案例系列】计算器工具开发

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 Hello,又见面了,今天分享如何使用Unity制作计算器,难度中 ...

  5. 【Unity3D小工具】Unity3D中实现仿真时钟、表盘、仿原神时钟

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...

  6. unity3d 可视化编程_R编程系列:R中的3D可视化

    unity3d 可视化编程 In the last blog, we have learned how to create "Dynamic Maps Using ggplot2" ...

  7. 游戏开发 unity3d python_游戏研发系列 Unity3D/2D游戏开发从0到1 第2版.pdf

    作 者 :刘国柱著 出版发行 : 北京:电子工业出版社 , 2018.01 ISBN号 :978-7-121-33499-3 页 数 : 507 丛书名 : 游戏研发系列 原书定价 : 99.00 开 ...

  8. 【Unity3D小技巧】Unity3D中Animation和Animator动画的播放、暂停、倒放控制

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...

  9. Unity3D官方案例1-星际航行游戏Space Shooter

    Unity3D官方案例1-星际航行游戏Space Shooter [1]学习中的使用的类 1.Input:使用此类读取常规游戏设置中的轴,访问移动设备的多点触控和加速度. 本例使用到的方法: GetA ...

  10. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

最新文章

  1. 《高效程序员的45个习惯》之体会
  2. FPGA/CPLD按键硬件延时消除抖动的思路
  3. oracle:更改序列
  4. 这些大酒店用大数据和分析技术对我们做了什么?
  5. Maven报错Missing artifact jdk.tools:jdk.tools:jar:1.7--转
  6. 【论文复现】使用RNN进行文本分类
  7. 记录一次ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exis故障【已解决】
  8. JAVA实现简单的FTP服务器
  9. IE8升级IE11失败原因整理
  10. 视频通讯使用的SIP协议详解
  11. Python根据内部文件名批量更改文件夹名称
  12. [ 程序员那些事 ]程序员会修电脑?程序员到底是干嘛的?
  13. 键盘错误代码39解决方法
  14. 用爬虫模拟登陆urp教务处系统
  15. STM32 无法使用IAR下载程序问题
  16. 密码学实验4 欧拉数求解和DES的初始置换
  17. 电子设计之国赛准备-----(前言)
  18. RPG Maker MV 打包安卓和修改分辨率的方法
  19. 自动抓取app数据的攻与防
  20. 一曲《千秋令》,唱不尽千古风华

热门文章

  1. 10、 基于STM32的汽车倒车防撞雷达
  2. 最全企业级数仓建设迭代版
  3. 有关嵌入式、单片机、51单片机、STM32、的一些概念详解
  4. radius服务器认证系统,TekRadius(RADIUS服务器)
  5. 计算机键盘操作与基指法,计算机键盘操作.doc
  6. Trapcode Particular 4 for Mac(AE三维粒子插件)附序列号破解版
  7. java 弹弹堂源码_弹弹堂s应用宝版下载
  8. Python爬取实战-爬取菜鸟教程python100例
  9. 关于Webstorm汉化后无法打开设置,谈谈心里的想法
  10. java编写进行货币兑换_货币汇率java assignment