unity3d无缝场景切换解决方案
- 格式:pdf
- 大小:301.23 KB
- 文档页数:9
【转】Unity3d的单例及场景间的数据传递单例是场景间切换时传递数据的最常见的⽅式之⼀,在unity中,很多⽅法被封装,有时候感觉不知道从何处看起,只能从官⽅⽂档上去根据功能找类了。
个⼈感觉u3d可视化太过强烈,许多⾃定义的⼀些功能似乎让⼈⽆从下⼿,当然也可能是⾃⼰⽔平不够,不太熟悉。
⽐如说场景间的数据传递,在cocos2dx时,我⼀般会在director⾥边创建⼀个单例Interface,⽤以游戏中的从读取玩家信息,关卡信息,场景间的数据同步等;要么就是在场景间切换的时候直接⽤带参数的构造函数实现,在u3d就不⽤说了,场景⼀般是直接在界⾯上创建了,切换场景时也只是简单的⼀句 Application.LoadLevel(scene);,没法在另⼀个场景创建时传递数据,因为它的创建场景函数是这样的:[csharp]1. // 摘要:2. // Create a new scene.3. [WrapperlessIcall]4. public static void NewScene();因⽽只好⽤单例去实现了:关于单例也很多种实现形式,参考了⽹上⼀些别⼈的⽅法,⾃⼰实践整理出三种较为便捷的⽅法,⽐较简单⽅法⼀:纯c#单例,这个单例正常是不需要使⽤unity的接⼝和⽅法,当然,如果要读取⽂件⽤它的也是更⽅便[csharp]1. using UnityEngine;2. using System.Collections;3. //⽤以存放数据测试⽤的结构体4. public struct Tollgate_Date5. {6. public int index;7. public int playerhealth;8. }9.10. public class MyInterface/* : MonoBehaviour*/11. {12. private static MyInterface myinterface = null;13. public Tollgate_Date[] date = new Tollgate_Date[10];14.15. // Use this for initialization16. void Start () {17.18. }19. public static MyInterface getInstance()20. {21. if(myinterface==null)22. {23. myinterface=new MyInterface();24. myinterface.init();25.26. }27. return myinterface;28. }29. public void init()30. {31.32. for (int i = 0; i < date.Length;i++ )33. {34. date[i].index = 1;35. date[i].playerhealth = 1;36. }37.38. }39. // Update is called once per frame40. void Update ()41. {42.43. }44. }这个⽅法,就不能再继承基类MonoBehaviour了,继承之后它默认需要挂在在⼀个对象⾝上,所以⼊过不给对象,那么将赋值不了,myinterface⼀直为空。
电影前期“三维动态分镜头预演”的用途与解决方案作者:孙恒一孙磊来源:《文艺生活·中旬刊》2017年第11期摘要:近些年,由于游戏引擎技术和计算机硬件的飞速发展为电影领域“高效”制作三维动态分镜头预演带来了契机,市场上涌现出一批可实现快速制作“3D Pre-viz”的专业软件和辅助软件,其中以iClone,Quick Storyboard,Unity3D为代表的新兴软件迅速占领动画制作领域。
电影前期设计的表现,尤其是视听语言的设计呈现出“形式多样化、操作自动化”的趋势。
本文将针对电影前期视听设计中“3D Pre-viz”这一环节的用途和使用情况做个简单介绍,并举以实例详述如何利用相关软件来制作“三维动态分镜头预览”。
关键词:电影前期;“三维动态分镜头预演”中图分类号:J954 文献标识码:A 文章编号:1005-5312(2017)32-0106-01一、使用iClone制作三维动态分镜头预览的思路新型3D Pre-viz制作工具基于3D游戏图形图像技术,利用游戏引擎,通过硬件纹理显示来即时生成影像画面,无需花费时间渲染画面且图像精美程度较高。
以“iClone”为代表的新一代快速3D动画制作软件进入电影工业的视线,被新锐导演所青睐。
它上手容易,操作简便,功能强大,生成图像精美,最重要的是输出影片时间极短,制作效果可随时根据导演要求进行快速调整。
甚至导演也可使用这个软件,仅需数小时培训即可全面掌握操作要领并独立创作3D影片。
而对于用户来说,在硬件配置上仅需一台电脑,导演就可凭借一己之力轻松快速地创作3D Pre-viz了!作者是三维动画师出身,从事过影视特效、游戏美术和虚拟现实等CG工作,熟悉主流三维软件,擅长制作3D Pre-viz。
经过一段时间操作实践,逐渐摸索出一条以iClone为主,Unity3D,3Dxchange,Premiere,3dMax为辅的一整套“三维动态分镜预览”解决方案——其中iClone负责快速3D动画制作,Unity3D负责提升画面效果并输出游戏文件,3dXchange用来与其他3D制作软件(3dMax等)进行文件交互,最后Premiere将镜头进行剪辑、输出样片。
Unity3D游戏GC优化总结---protobuf-net⽆GC版本优化实践⼀ protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被⼴泛使⽤的Google Protocol Buffer库的c#版本,之所以c#版本被⼴泛使⽤,是因为c++版本的源代码不⽀持Unity3D游戏在各个平台上的动态库构建。
它是⼀个⽹络传输层协议,对应的lua版本有两个可⽤的库:⼀个是proto-gen-lua,由tolua作者开发,另外⼀个是protoc,由云风开发。
protobuf-net在GC上有很⼤的问题,在⼀个⾼频率⽹络通讯的状态同步游戏中使⽤发现GC过⾼,所以对它进⾏了⼀次⽐较彻底的GC优化。
下⾯是优化前后的对⽐图:protobuf-net优化前GC和性能效果图protobuf-net优化后GC和性能效果图⼆ Unity3D游戏GC优化概述 有关Unity3D垃圾回收的基本概念和优化策略Unity官⽹有发布过⽂章:。
这篇⽂章讲述了Unity3D垃圾回收机制,和⼀些简单的优化策略,讨论的不是特别深⼊,但是⼴度基本上算是够了。
我罗列⼀下这篇⽂章的⼀些要点,如果你对其中的⼀些点不太熟悉,建议仔细阅读下这篇⽂章: 1、C#变量分为两种类型:值类型和引⽤类型,值类型分配在栈区,引⽤类型分配在堆区,GC关注引⽤类型 2、GC卡顿原因:堆内存垃圾回收,向系统申请新的堆内存 3、GC触发条件:堆内存分配⽽当内存不⾜时、按频率⾃动触发、⼿动强⾏触发(⼀般⽤在场景切换) 4、GC负⾯效果:内存碎⽚(导致内存变⼤,GC触发更加频繁)、游戏顿卡 5、GC优化⽅向:减少GC次数、降低单次GC运⾏时间、场景切换时主动GC 6、GC优化策略:减少对内存分配次数和引⽤次数、降低堆内存分配和回收频率 7、善⽤缓存:对有堆内存分配的函数,缓存其调⽤结果,不要反复去调⽤ 8、清除列表:⽽不要每次都去new⼀个新的列表 9、⽤对象池:必⽤ 10、慎⽤串拼接:缓存、Text组件拆分、使⽤StringBuild、Debug.Log接⼝封装(打Conditional标签) 11、警惕Unity函数调⽤:、GameObject.tag、FindObjectsOfType<T>()等众多函数都有堆内存分配,实测为准 12、避免装箱:慎⽤object形参、多⽤泛型版本(如List<T>)等,这⾥的细节问题很多,实测为准 13、警惕协程:StartCoroutine有GC、yield return带返回值有GC、yield return new xxx有GC(最好⾃⼰做⼀套协程管理) 14、foreach:unity5.5之前版本有GC,使⽤for循环或者获取迭代器 15、减少引⽤:建⽴管理类统⼀管理,使⽤ID作为访问token 16、慎⽤LINQ:这东西最好不⽤,GC很⾼ 17、结构体数组:如果结构体中含有引⽤类型变量,对结构体数组进⾏拆分,避免GC时遍历所有结构体成员 18、在游戏空闲(如场景切换时)强制执⾏GC三 protobuf-net GC分析3.1 protobuf-net序列化 先分析下序列化GC,deep profile如下: 打开PropertyDecorator.cs脚本,找到Write函数如下:1public override void Write(object value, ProtoWriter dest)2 {3 Helpers.DebugAssert(value != null);4 value = property.GetValue(value, null);5if(value != null) Tail.Write(value, dest);6 }View Code 可以看到这⾥MonoProperty.GetValue产⽣GC的原因是因为反射的使⽤;⽽ListDecorator.Write对应于代码Tail.Write,继续往下看: 找到对应源代码:1public override void Write(object value, ProtoWriter dest)2 {3 SubItemToken token;4bool writePacked = WritePacked;5if (writePacked)6 {7 ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest);8 token = ProtoWriter.StartSubItem(value, dest);9 ProtoWriter.SetPackedField(fieldNumber, dest);10 }11else12 {13 token = new SubItemToken(); // default14 }15bool checkForNull = !SupportNull;16foreach (object subItem in (IEnumerable)value)17 {18if (checkForNull && subItem == null) { throw new NullReferenceException(); }19 Tail.Write(subItem, dest);20 }21if (writePacked)22 {23 ProtoWriter.EndSubItem(token, dest);24 }25 }View Code 可以看到这⾥的GC是由list遍历的foreach引起的。
基于Unity3D的虚拟现实场景交互设计与优化虚拟现实(Virtual Reality,简称VR)作为一种新兴的技术,正在逐渐改变人们的生活方式和工作方式。
在虚拟现实技术中,Unity3D作为一款强大的跨平台游戏开发引擎,被广泛应用于虚拟现实场景的开发。
本文将重点探讨基于Unity3D的虚拟现实场景交互设计与优化。
1. 虚拟现实场景交互设计在虚拟现实场景中,用户与虚拟环境进行交互是至关重要的。
良好的交互设计可以提升用户体验,增强沉浸感。
在Unity3D中,通过编写脚本和使用内置组件,可以实现丰富多样的交互设计。
1.1 用户输入用户输入是虚拟现实场景中最基本的交互方式之一。
Unity3D支持多种输入设备,如手柄、头盔追踪器、手势识别等。
设计师需要根据不同设备的特点,合理设置用户输入方式,以便用户可以自然而然地与虚拟环境进行互动。
1.2 物体交互在虚拟现实场景中,物体之间的交互也是非常重要的一部分。
通过添加碰撞器和物理材质,可以实现物体之间的碰撞、抓取、移动等操作。
设计师需要考虑物体之间的交互逻辑,使得用户可以按照自己的意愿进行操作。
1.3 界面设计界面设计是虚拟现实场景中不可或缺的一环。
在Unity3D中,可以通过Canvas和UI元素来创建各种界面。
设计师需要注意界面的布局、颜色、字体等细节,以确保用户可以清晰地看到并操作界面上的元素。
2. 虚拟现实场景优化除了交互设计外,优化也是虚拟现实场景开发中必不可少的一环。
优化可以提升程序性能,减少延迟,增加流畅度,从而提升用户体验。
2.1 渲染优化在虚拟现实场景中,渲染是一个非常消耗性能的环节。
为了提高帧率和减少延迟,设计师可以采取一些优化措施,如减少三角形数量、合并网格、使用LOD(Level of Detail)等技术。
2.2 物理优化物理引擎是虚拟现实场景中常用的组件之一。
为了提高物理仿真效果和减少计算量,设计师可以对物理引擎进行优化,如调整碰撞检测精度、限制物理计算范围等。
UIToggle:切换,从名字就能知道这个组件能做什么。
这个组件有两种状态ON/OFF.可以用于创建checkboxes, t button groups。
该文章出自【狗刨学习网】效果展示:一:使用步骤——创建一个checkboxes1.首先在UI Root下建立一个Sprite,设置一张贴图,当作按钮的背景。
然后为其添加碰撞组件和Toggle组件2.为第一个Sprite建立一个子Sprite,设置一张图片,当作选中的标识。
将其调整到适当的位置。
3.选择第一个Sprite的UIToggle组件为State Transition中的Sprite设置对象,即刚才添加的子Sprite。
以上便创建了一个checkboxes。
二:创建一个radio button groups1.将上面创建的checkboxes复制3个。
2.将他们三个的UIToggle中的Group属性,都改为同一个数字,但不能是0。
注意:UIToggle中的Starting State如果勾选的话初始状态则为选择状态。
三:监听UIToggle属性的变化定义一个脚本CheckBox_Test,创建一个方法isActive,然后将这个脚本添加到下面,并选择刚才定义的方法。
四:UIToggledObjects使用这个组件可以实现Tab切换的效果。
1.接着上面的项目,在CheckBox下面创建两个Sprite2.为checkbox添加UIToggledObjects组件其中Activate表示激活状态下显示的组件,Deactivate表示激活状态下隐藏的组件。
设置如下:其中两个Sprite,是不同的两个Sprite,即刚才创建的那两个。
效果如下:081201542764491.png(6.91 KB, 下载次数: 0)。
摘要计算机游戏作为一种新兴的娱乐方式,已经融入到了人们的生活之中。
近年来,游戏产业己经成为经济市场中增长速度最快的热点,是众所关注的焦点。
Unity3D作为一款能跨平台的,界面友好,操作简单的工具,是一个全面整合的专业游戏引擎。
本文研究了第一人称射击游戏,即通常所说的FPS游戏。
本文基于Unity3D 引擎,使用Microsoft Visual Studio编写脚本,使用3dmax和Photoshop进行图形和建模处理工作。
通过操作模拟角色达成各种动作,完成游戏。
程序中有主菜单、暂停菜单和游戏结束菜单,能够选择重新开始游戏和退出游戏等操作。
在环境上展示了天空到陆地,森林草地到海面。
角色能够完成跳跃,行走,切换武器等基本动作,射击敌人会增加积分,拾取的物体和角色状态能显示在GUI界面上。
游戏中的敌人会自动生成并追踪玩家,在一定距离内会攻击玩家,被击败后会掉落弹药。
若玩家被敌人击败,则结束游戏并切换到游戏结束菜单。
关键词:Unity3d;Visual Studio;3dmax;Photoshop;FPS游戏ABSTRACTAs a new form of entertainment, computer games have been integrated into our lives. In recent years, the game industry has become the fastest growing hot spot in the economic market, is the focus of attention.Unity3d as a cross-platform, user-friendly, easy to operate tool, is a comprehensive integrated professional game engine.This article studies the first-person shooter game, which is commonly said FPS game. This article is based on the Unity3d engine, using Microsoft Visual Studio scripting, using the 3dmax and Photoshop the works with graphics and modeling. Through the operation of the simulation role to achieve a variety of actions to complete the game. The program has main menu, pause menu and Game End menu, can choose to restart the game and quit the game and so on. The environment shows the sky to the land, the forest meadows to the sea. The characters can jump, walk, switch weapons and other basic movements, shooting enemies will add points, pickup objects and role status can be displayed in the GUI interface. The enemy in the game will automatically generate and track the player, at a certain distance will attack the player, defeated will drop ammunition. If the player is defeated by the enemy, end the game and switch to the game end menu.Keywords: Unity3d; Visual Studio; 3dmax; Photoshop; FPS games目录1 绪论 (1)1.1 选题背景和意义 (1)1.1.1 选题的背景 (1)1.1.2 论文的研究意义 (1)1.2 第一人称射击游戏的国内外发展现状 (2)1.3 本文研究的主要目的与内容 (2)1.4 本章小结 (3)2 开发环境及主要开发工具简介 (4)2.1 Unity 3D (4)2.1.1 事件函数、脚本执行顺序和生命周期 (5)2.1.2 常用API (5)2.1.3 材质、灯光和着色器 (6)2.2 3DMAX (7)2.3 Visual Studio (8)2.4 Photoshop (8)2.5 本章小结 (9)3游戏策划 (10)3.1 游戏简介 (10)3.2游戏元素设计 (11)3.3游戏角色设计 (11)3.4游戏敌人设计 (12)3.6 本章小结 (17)4 游戏功能模块 (18)4.1 GUI模块 (18)4.1.1 主界面菜单 (18)4.1.2 游戏场景内GUI的显示 (20)4.1.4 游戏结束菜单 (23)4.2角色模块 (24)4.2.1 主角模块 (24)4.2.2 敌人模块 (26)4.3弹药模块 (28)4.3.1 弹药和弹药箱模型 (28)4.3.2 弹药安装 (30)4.4 武器模块 (31)4.4.1 武器开火实现 (31)4.4.2 武器动画实现 (32)4.4.3 瞄准缩放效果的实现 (33)4.5 本章小结 (34)5游戏测试 (35)5.1 游戏测试环境 (35)5.2主要功能实现测试 (35)5.3 测试意义 (37)6总结 (38)参考文献 (39)致谢 (40)1 绪论1.1 选题背景和意义1.1.1 选题的背景2017年,中国的游戏行业整体营业收入大约为2189.6 亿元,同比增长了23.1%。
Unity切换场景时如何回到原有场景状态?
本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术。
本文将为读者讲解Unity切换场景时如何回到原有场景状态。
问题:
Jason
我在用Unity3D做一个回合制的战斗游戏,有两个场景(小镇的场景和战斗的场景),每当角色遇到怪兽,游戏就切换到战斗场景,角色就在这里战斗,直到打败怪兽或者被击败。
问题是怎样才能在回到townScene时保持进入战斗场景时的状态(角色位置、状态等等)
如果我用:
1Application.LoadLevel('battlescene');。
unity3d中ontriggerenter和ontriggerexit的调用规律《Unity3D中OnTriggerEnter和OnTriggerExit的调用规律》在Unity3D中,有两个常用的触发器方法,分别是OnTriggerEnter和OnTriggerExit。
这两个方法在游戏开发中经常用来处理物体之间的碰撞和离开碰撞的情况。
在使用这两个方法时,需要注意它们的调用规律,以确保游戏逻辑的正确性。
首先让我们来了解一下OnTriggerEnter和OnTriggerExit方法的基本作用。
OnTriggerEnter方法在一个Collider(碰撞器)进入另一个Collider时被调用,而OnTriggerExit方法在一个Collider离开另一个Collider时被调用。
这两个方法可以在脚本中通过重写的方式来实现特定的功能,比如角色与物体的碰撞检测、触发特定事件等。
在实际使用中,需要注意OnTriggerEnter和OnTriggerExit方法的调用规律。
首先,在两个Collider中,必须至少有一个是触发器类型的Collider,也就是勾选了IsTrigger属性的Collider。
其次,这两个方法只被调用一次,即当一个Collider进入或离开另一个Collider时,对应的方法只会被调用一次。
另外,需要注意的是当一个Collider进入另一个Collider之后,OnTriggerExit方法不会立刻被调用。
而是要等待第一个Collider完全离开第二个Collider后,OnTriggerExit方法才会被调用。
这一点在处理游戏逻辑时尤为重要,因为有时候我们需要确保物体在离开碰撞区域后才执行特定的操作。
总的来说,在Unity3D中使用OnTriggerEnter和OnTriggerExit方法需要牢记它们的调用规律,确保在游戏开发中处理碰撞和离开碰撞的情况时能够顺利实现我们预期的游戏逻辑。
李鸿章故居虚拟现实系统的设计与开发作者:***来源:《电脑知识与技术》2024年第12期关键词:李鸿章故居;虚拟现实技术;Unity 3D0 引言李鸿章故居,又名李府,是晚清名臣李鸿章的家宅,位于安徽省合肥市庐阳区淮河路步行街中段208 号,现已列为全国重点文物保护单位、国家AAAA级旅游景区[1]。
李鸿章是晚清时期极具重要的人物,其家宅的建筑风格具有明显的徽派建筑特色,布局整齐,结构严谨,是典型的晚清江淮地区民居建筑。
作为珍贵的建筑文化遗产,李府历经百年风雨,仍保有独特的风貌。
然而,由于战争和年久失修,再加上位于市区中心,李府已日渐荒废。
近年来,合肥市政府对李鸿章故居采取了多项保护措施,在原址进行了修缮。
虽然基本保留其原貌,但现存规模已不到原来的十二分之一。
由于其地理位置特殊,李府作为景区的拓展性受到了很大制约。
目前,李鸿章故居每日接待游客数维持在500人左右,这对游客体验及景区收入产生了不良影响[1]。
那么,这样一座历史悠久底蕴丰富的古代文化遗产建筑,应当如何保护,值得我们深入探索与研究。
1 李鸿章故居系统的总体设计本文基于虚拟现实技术和旅游体验的有机结合,力求将单调、枯燥的文字和局限于平面的图片立体化,将原本很难呈现的建筑细节之美展现在游客面前。
我们利用物联网及各种智能云技术,让游客足不出户,就可以随时获得最新的旅游动态和相关讯息,同时也可以轻而易举调整、安排时间,随意更改旅游行程。
近年来,因经年累月游客络绎不绝,我国有许多对外开放的古代建筑损毁严重,如何保护这些文物是一个亟待解决的问题。
随着计算机科学家和考古学家的共同努力,虚拟现实漫游系统应运而生。
我国历史上无与伦比的辉煌建筑杰作——故宫,就得到了这样的保护[2]。
鉴于此,本文研究运用三维技术和Unity3D实现对李鸿章故居中重要的几处景点,使用手动或自动方式,对入口、前厅、福寿堂、走马楼、淮军展厅、游客服务中心等实现漫游。
李鸿章故居的虚拟现实系统主要采用第一人称视觉的漫游效果来展现,这样能够更好地模拟景区真实存在的效果。
unity3d无缝场景切换解决方案(1) - 简单场景切
换
所谓无缝场景切换,无非是涉及到场景或物体的预读,复杂点涉及下场景卸载,在复杂点涉及到场景二维数组,再在复杂点涉及数据结构用二叉树实现场景资源有序的读取与卸载。
当然,复杂的我以后慢慢再说,比较懒,先写最简单的,如果能起到抛砖引玉作用,那这篇文章也算是物有所值了。
无缝场景切换的优缺点:
优点:
1.场景(游戏)连贯性。
2.相对于多场景游戏,不需要等待场景更换(在进入场景后已经在实
时加载下一个场景了)
3.相对于单个大场景,这种方式能避免所有的场景数据被装入内存
(尽管u3d优化很好并不会被渲染出来),很大的数据在内存里影响你游戏的性能(特别是在iphone这种小内存环境)。
缺点:
1.操作繁琐(本文介绍比较基础简单的方式)
2.开发者要求较高(注意保持逻辑清晰,不然后期你会全乱掉的)
涉及到几个U3D函数:
Application.LoadLevel(lv) 场景读取(记着用多场景前要现在File-Build Setting里登记下场景,才能在脚本里读取到)
DontDestroyOnLoad(object) 保持物体在场景切换的时候不被卸载
(能保持他的所有属性哦)
*AssetBundle 类 预读资源(主要用于web3d,运行时实时从服务器下载需要的场景资源)
涉及到几个基础知识:
static 静态类、静态变量:在整个游戏中都不会被重新加载,所以可以当全局全场景变量使用,主要用于记录场景数组。
Collider的Is Trigger属性:设置成True,他是可以穿越不会产生能量传递的,但是,他是可以接受碰撞侦测的。
配合主角的OnTriggerEnter 事件,就可以知道你是否正在穿越一个Trigger了。
在这里,我们用在判断何时加载新场景上。
简单的无缝场景切换方案:
1.建立场景(已经做好很大场景的就准备做切割吧)
场景尽量小,如果是web3d,那需要更小,已保证场景在网络上传输时间不至于太长,在漫游中再实时读取其他场景数据。
一般来说,场景大小考虑因素有两种:如果是web3d模式,考虑网络传输速度;如果是pc,mac,wii,iphone,那就得考虑内存或显存能吃你多少场景数据并且处理起来不费力。
按照你所需要建立的无缝场景切换方式,你可以按场景的坐标建立以下几种方式:
1 ) 双场景切换(本文重点)
2)九宫格场景切换
1)双场景切换:用于单个场景较大的情况。
同一时间只加载1个到2个场景(预读周围4个场景),场景间需要交错,避免让用户看到场景的边界深渊=.=.当用户走到边界,就加载下一个场景,如果走到4个顶点,加载下两个场景(如果场景庞大应尽量用障碍物避免用户走到顶点,因为
走到顶点要加载的数据是走到边界加载的2倍-,-)
2)九宫格场景切换:用于单个场景较小的情况。
因为同一时间需要在内存中载入以用户为中心的周围(包括本地)9个场景资源,不同于双场景切换的是,场景间不需要交错,因为用户视野永远不会看到当前场景界限。
用9宫格方式需要将场景预先存入静态的二维数组,以便读取使用。
2.制作场景边界
使用Cube + IsTrigger=True属性是最好的办法。
1)如果是双场景切换,注意两个场景边界坐标别重在一起,不然你走到边界会发现两个边界不停的切换=.=,要让2个场景边界互相交错一起(做的时候你自然会明白)。
有必要的话,边界可以往里面缩一点(甚至可以吧场景重叠1/3,但这样两个场景你要做很多重复的东西),避免用户看到边界。
然后建议是把Cube的名字设置成邻接场景名称,因为待会儿写脚本时候方便。
2)如果是九宫格场景,那就不需要重在一起了,边界Cube名字建议使用本场景的名字,因为这样你一走到下一个场景,就可以知道你在的场景位置而读取周围新场景了。
3.编写脚本
好了,现在可以开始写脚本了,我一如既往的很懒,所以不会吧全部
代码粘帖出来。
先理清楚逻辑关系以及一些常识:
1.是主摄像机走到边界才会做场景加载或卸载动作。
所以代码是放在
主摄像机上或者主角上。
2.场景可以加载,但是没有卸载场景这个东西(也没必要卸载,因为
同一时间只会有一个场景为当前场景),所以如果你用九宫格方式做
无缝连接,你需要把场景读取,然后让场景里所有物体DontDestroyOnLoad(当然包括主角,也就是this),然后其他场景也
这么操作,当需要卸载场景时,只要把所有那个场景Object给Destroy
掉就可以了。
而做双场景连接则不需要这样,也简单的多。
3.如果是九宫格,你需要一个静态二维数组去记录每个位置场景的名
字。
这里也可以不需要这么做,有个技巧,你可以格式化场景名字规
则来推算下一个需要加载的场景名字,比如M1N1表示(1,1)场景,那
你就可以用字符串拆分的方法知道需要读取M0N0,M1N0,M2N0等等的
场景。
4.接下来就是处理碰撞,获取下一个场景(双场景方式)或者当前场景
(九宫格方式)的名字,这里你就可以看到一个被格式化过的场景名有多
么重要。
1functionOnTriggerEnter(other:Collider){2//这是双场景
方式直接把边界Cube名字设为了下一个场景
名 3Application.LoadLevel(); 4}5 更加复杂化的无缝切换方案思路:
1.使用角色与边界距离动态判断,以确定载入时机以及载入哪个方位的场景。
2.加入判断角色为中心的圆内的物体加载(操作起来有点复杂,除非你整个场景是数字化的,或者干脆是动态生成的),这需要一个加权的二叉搜索树将大地图所有的物体放进去,在满足条件时候去载入最近的。
(仅提供思路,可能有更好的数据结构去优化他)
转自:/blog/article/unity3d/u3d_cjwf.htm
unity3d场景间切换与数据传递及物体删除技巧
先介绍一些基本函数(具体用法自己查文档):
--------------------------------------------------------
1.场景切换:Application.LoadLevel("Level1")
2.读取场景时不移除物体:DontDestroyOnLoad(object) //会保留该物体的任何数据,包括坐标,可以用于任何物体,也包括GUI哦,可以灵活运用。
3.设置该物体激活状态(移除物体前先执行这个,预防组件在运行状态不允许移除):SetActiveRecursively(bool)
4.移除物体(移除不掉时候先设置他的激活状态为false):Destroy()
5.创建prefab或者其他object的克隆:Instantiate(xxx)
然后介绍一些基础知识:
------------------------------------------------------
1.文件间传递可以用static静态类型来桥接数据(见我另外一篇blog),当然场景间传递也可以。
2.注意引用与值传递!!a.如果你传的是个引用类型,但引用的东西却是场景实物,那你就得用上面第二个函数保留该物体(否则下一场景这个引用所指的内容就不存在了,会出错的),这样在新场景中可以直接继承他的所有即时属性;b.当然如果你传的这个引用指向一个prefab,那就不存在这问题了,这里如果当前场景已经改变了角色数据,那你传递引用后也要传递被改变的属性,好在新的场景中重新赋值给这个prefab的克隆体。
(如果你用文件记录角色状态,那用b方法是最好的)
最后是实例讲解:
-------------------------------------------------------
目标:场景1选择好一辆车 GO-> 场景2使用选中的车比赛
流程介绍:
场景1(车库):
选车(有好几辆车可以选的),然后将这个车的prefab引用传递到一个js文件的static变量里储存
进入场景2:
在原先地面指定的坐标克隆刚才引用的prefab,完成目标(注意代码设置一些数据,比如摄像机跟踪参数等)。
对手车是随机的^ ^原理一样,只不过不需要传值,订好坐标随机产生AI就可以。
==============
现在就恨自己没钱买MacBook pro和iphone了,游戏基本成型,就差iphone上的手感调试、功能性能测试和界面调试了。
转自:/blog/article/unity3d/u3d_cj_sh.html。