unity3d_unity3d- - CSDN
unity3d 订阅
Unity是游戏引擎开发商 [1-2]  ,实时3D互动内容创作和运营平台 [3]  。 [2]  包括游戏开发、美术、建筑、汽车设计、影视制作在内的创作者运用Unity实现。 [2]  Unity提供一整套软件解决方案,可用于创作、运营和变现实时互动的2D和3D内容 [2]  ,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 [2]  2019年使用Unity制作的游戏和体验已在全球范围内覆盖将近30亿台设备 [4]  ,月均下载量超过30亿次 [5]  。并且其在2019年的安装量已超过370亿次。 [4]  全平台(包括PC/主机/移动设备)游戏中有一半都是基于Unity创作的。 [5]  Unity提供易用实时平台,开发者可以在平台上构建各种AR和VR互动体验 [5]  ,全球超过60%的AR和VR内容都用Unity制作。 [5]  2020年5月9日,Unity宣布收购加拿大技术服务公司Finger Food,拓展工业应用版图。 [6] 展开全文
Unity是游戏引擎开发商 [1-2]  ,实时3D互动内容创作和运营平台 [3]  。 [2]  包括游戏开发、美术、建筑、汽车设计、影视制作在内的创作者运用Unity实现。 [2]  Unity提供一整套软件解决方案,可用于创作、运营和变现实时互动的2D和3D内容 [2]  ,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 [2]  2019年使用Unity制作的游戏和体验已在全球范围内覆盖将近30亿台设备 [4]  ,月均下载量超过30亿次 [5]  。并且其在2019年的安装量已超过370亿次。 [4]  全平台(包括PC/主机/移动设备)游戏中有一半都是基于Unity创作的。 [5]  Unity提供易用实时平台,开发者可以在平台上构建各种AR和VR互动体验 [5]  ,全球超过60%的AR和VR内容都用Unity制作。 [5]  2020年5月9日,Unity宣布收购加拿大技术服务公司Finger Food,拓展工业应用版图。 [6]
信息
开发公司
Unity Technologies
类    别
创作引擎、开发工具 [2]
员工数
约3500名 [2]
CEO
John Riccitiello [7]
别    名
U3D、Unity3D
属    性
软件公司 [2]
成立时间
2004年 [4]
支持维度
2D、3D、VR、AR、MR [2]
外文名
Unity
编程语言
C# [2]
Unity基本介绍
Unity3D(7张) Unity [8]  引擎使开发者能够为超过20个平台创作和优化内容 [5]  ,包括iOS、安卓、Windows [2]  、Mac OS、索尼PS4、任天堂Switch [2]  、微软Xbox One、谷歌Stadia、微软Hololens、谷歌AR Core、苹果AR Kit、商汤SenseAR等等 [2]  。公司超过1400人规模的研发团队让Unity的技术跟随合作伙伴迭代 [5]  ,确保在最新的版本和平台上提供优化支持服务。 [5]  Unity还提供运营服务来帮助创作者 [2]  ,包括:Unity Ads广告服务、Unity游戏云一站式联网游戏服务、Vivox游戏语音服务、Multiplay海外服务器托管服务 [2]  、Unity内容分发平台(UDP)、Unity Asset Store资源商店 [2]  、Unity云构建等。 [2]  Unity在中国、比利时、芬兰、加拿大、法国、新加坡、德国等16个国家拥有44个办公室 [5]  ,创作者分布在全球190个国家和地区。 [5] 
收起全文
  • 本课程主要讲解了 C# 语言的面向对象特性,是进行 Unity 3D 开发的基础。大部分的语言都支持面向对象,学好面向对象,能极大地提高我们的开发效率。面向对象相关的知识点本身就会有些抽象,概念很多,所以需要认真...
  • Unity3D基础知识、游戏算法一网打尽。
  • 零起步,快进阶,基础+算法融汇到项目实战中,细节+核心直到上线,一步步引领菜鸟做出大虾级的开发。
  • Unity3D是一个跨平台的游戏开发引擎,它能够帮助开发者快速构建游戏场景,进行游戏开发与发布。它支持将开发好的作品发布到Windows、Mac OS、Android、iOS、Linux等多种平台。另外,Unity3D官方版本目前可以运行在...

    《Unity3D入门教程》会带领零基础的初学者,一步步学会使用Unity3D来开发简单的应用程序,走近游戏开发的世界。本系列教程虽然不会面面俱到地深入到全部的知识点,但是会涉及到所有入门阶段所需要掌握的必备技能。通过本教程的学习,可以快速“入门”。师傅领进门,修行在个人。当我们掌握了基本的框架和技能后,就可以自由选择自己喜欢的点去深入学习。本教程是博主自己学习Unity3D时候总结的学习笔记,基本能够涵盖住入门阶段所需要学习的点。希望能都对读者有哪怕那么一点点的帮助,也不枉敲了那么久的键盘,码了那么些字。Enjoy Unity3D!


    ------------------------------------------------------------------------------------------------------------------

    1 Unity3D介绍

    Unity3D是一个跨平台的游戏开发引擎,它能够帮助开发者快速构建游戏场景,进行游戏开发与发布。它支持将开发好的作品发布到Windows、Mac OS、Android、iOS、Linux等多种平台。另外,Unity3D官方版本目前可以运行在Windows和Mac OS上,当然还有可以运行在Linux上的非官方版本。


    打开Unity3D官网,可以开到如下的画面,可见Unity3D的主要目标还是集中在游戏开发上,也包含VR/AR的开发。


    2 Unity3D下载与安装

    https://store.unity.com/cn/?_ga=1.18936120.1875984010.1467707827

    打开上面Unity商店网址,会看到如下的界面。


    选择免费的个人版,点击进入。


    可以直接点击下载安装程序,也可以点击底部最右侧的“Unity旧版本”。我一般会选择后者,因为这样就可以自由选择要安装的版本。开发中最好采用一样的版本,否则在打开别的程序的时候总会根据Unity版本重新生成工程,来回转换难免不会出现什么隐含的Bug。点击“Unity旧版本”后,实际上看到的列表中也包含最新的版本。


    根据你的系统选择相应的版本下载即可。例如我的是Win10 64位,我就点击5.4.1的“下载(Win)”按钮,选择Unity编辑器(64位)下载。我没有选择最新的版本,因为我已经有其他的程序是使用这个版本编辑的。如果你喜欢最新版,完全可以下载最新版,都是没问题的。

    之后在你的下载目录会有“UnitySetup64-5.4.1f1.exe”这个文件,双击运行。一路点继续,到安装路径的页面可以更改安装路径,其他都默认即可。安装完后,如果没有使用破解补丁破解,界面是灰白色的,破解后是深灰色的。其实使用功能上没什么区别,反正现在有了免费的个人版,对于我们做研究来说,破解与否没差别。


    第一次打开Unity可能需要登陆账号,可以随便注册一个登陆即可。点击“NEW”,输入工程名和路径,点击“Create project”。


    至此,表示软件安装成功,可以正常运行了。

    3 程序打包发布

    按Ctrl+S,保存当前场景,可以命名为MyScene。之后在Project中的Assets下就会有已经保存的场景。然后File——Build Settings,出现下面的面板


    点击“Add Open Scenes”就能将当前场景添加到待生成的列表里,然后左下方的平台就选择“PC, Mac & Linux Standalone”,然后点击Build。然后会要求你选择发布程序的路径和输入名称。如果和我一样选择默认路径,发布程序名称为“test”那么会在工程目录下看到发布出的程序。


    双击test.exe,会出现如下对话框:


    将分辨率设置为640*480,勾选Windowed,点击Play,就会看到如下场景:


    好了,现在我们已经成功发布了一款应用程序。尽管这个程序什么功能都没有,但是它仍然是我们使用Unity3D成功发布的第一个应用程序,具有非凡纪念意义。它表明我们已经走在Unity3D开发之路上了。


    展开全文
  • 本次系列课程的目标是让Unity3D初学者掌握Unity3d的性能优化技术,根据Profiler工具监控的CPU,GPU,内存等数据(CPU执行时间,GPU执行时间,内存大小等),分析程序的性能瓶颈,从而提高程序性能。 适合对象:Unity...
  • 1.Interactable System: 1.Picture Interactable:Player走到SecurityRoom墙前的那张画   2.Fish Interactable鱼档前的交互   3.Guard Interactable守卫   2.Player 这一Phase要实现在......

    1.Interactable System:

    1.Picture Interactable:Player走到SecurityRoom墙前的那张画

     

    2.Fish Interactable鱼档前的交互

     

    3.Guard Interactable守卫

     

    2.Player

    这一Phase要实现在SecurityRoom里点击地板Player在上面随着鼠标点击走动的效果。

    ----------------

    首先设置SecurityRoom的环境。

    点击Hierarchy下的SecurityRoomEnvironment里的指定选项,勾选Static,因为NavMash必须在静态的环境上Bake然后生效。

     

    Window→Navigation→Bake按如下选项

    各选项意义见下:

     

    Hierarchy下新建UI→EventSystem,并给EventSystem加上Audio Listener组件。注意,完整的游戏里EventSystem都是建在Presistent Scene里的,这里只是为了检测该单元而建立,之后会删掉。

     

    接着在Hierarchy下的Camera添加组件Physics Raycaster,该组件将对Scene里的物体进行光线投射,并把消息发送到(send)到EventSystem

     

    接着在SecurityRoom上添加添加Mesh Collider组件,Mesh选存好的方案。接着添加Event Trigger组件,点+添加新事件,内容暂时为空(截图用的是完整游戏)

     

    这里介绍一下EventSystem,它分为三步骤:发送(Send events),接收(Receive events)和执行(Manage events)。关系如下:

     

    上面Camera上挂Physics Raycaster组件是为了Send,刚才的SecurityRoom上挂Ecent Trigger组件是为了Receive。

    ----------------------

    然后设置Player

    在Project View下选择Animators文件夹→Player文件夹下新建Animator Controller命名为ClickToMove。Unity里Animator和Animation都是动画插件,Animator主要为了动画直接的切换,和什么情况下播什么动画;Animation主要控制一个动画的播放内容,比如先哪一帧后一帧。

     

    双击ClickToMove点+新建float型参数命名为Speed,再建4个trigger分别命名为HighTake,MedTake,LowTake,AttemptTake。

     

    在中间的操作区Base Layer上点击右键→Create State→From New Blend Tree创建一个新的混合树(Blend Tree)并命名为Walking。

     

    双击Walking混合树,在Inspector里改名为WalkingBlendTree,点击+选择Add Motion Field。共添加3个三个Motion Fields,然后按名字添加3个对应的状态动画。不要勾选Automate Thresholds(自动化阈值),然后点击Compute Thresholds选择Speed,可以看到3个Motion后的阈值比不再是1:0.5:1而是0:1.5:5.6了。

     

    点击Base Layer回到操作界面,在Animations文件夹→Player下多选Idle,TakeObjectAttempt和TakeObjects动画放入操作界面,并放置成这样

     

    再在这些动画间Make Transition如下图

     

    点击Walking→PlayerIdle的指向线,取消勾选Has Exit Time。点+添加条件,自动出来Speed,选择Less,填0.1,即速度小于0.1时播放Idle动画。再点击PlayerIdle→Walking指向性,同样取消存在时间,添加条件选Greater,填0.1

     

    再对Any State对其他动画的切换条件上加上分别对应其名字的trigger。

     

    注意四个动画到Walking的transition没有设置条件是因为这四个都有默认的Has Exit Time,即这些条件动画播放完了就回到走路状态。

     

    点击PlayerIdle,tag改为Locomotion。再点击Walking,tag改为Locomotion,注意拼写大小写完全正确。这是为了之后在代码里区分动画状态,只有当Locomotion下才能Walking其他的会播放其他动画。

     

    回到Scene视图,从Models文件夹把Player拽到Hierarchy下,选择Layer为Characters,弹出对话框选择覆盖子对象。Position设为(-0.7, 0, 3.5)Rotation设为(0,180,0)刚好在门口对着保镖。Animator组件的Controller选ClickToMove,添加组件Nav Mesh Agent更改如下选项。

    Nav Mesh Agent对应属性

     

    最后将Player保存到Prefabs文件夹。

    -------------------

    接下来是移动Player

    Assets→Scripts→MonoBevaviours→Player新建C#命名为PlayerMovenments,并把该脚本拖拽到Player预制上,打开并编辑

    首先我们要确定Player的移动方式:先由NavMeshAgent导航到鼠标点击点附近,进入一个范围,降低速度并用Movetowards移动,最后移动到离destination非常近的时候,直接设置Player的position为destinationPosition。

     

     

    保存后回到Unity,打开选中prefab下的player把引用拖进去,然后点击Hierarchy下的SecurityRoom,把引用拖进去并选好函数。

     

    保存场景测试,鼠标点击地面Player会跟着走动了。

    接着编辑PlayerMovement,加上对互动物的反应包括player转向面对互动物。

     

    至于Interactable类,将在之后讲解,回到Unity,点击Hierarchy下的PictureInteractable下的EventTrigger组件将Player拖入并选好函数,接着把Interactable代码组件拖进去。

     

    至此,我们实现了Player在安全屋内走动,点击墙上的画Player会走到画前,并互动。

     

    3.Inventory(仓库)

    之后我们将创建一个背包系统。

    这个系统首先应在场景切换时保持原内容;这个背包系统应该足够简单,但当背包系统设计变化时可扩展

     

    打开Persistent Scene,点击改为2D模式,16:9宽度

     

    双击Hierarchy下的PersistentCanvas,新建空子对象命名为Inventory,把Inventory拖到FadeImage的上方确保FadeImage可以在切换场景时盖住背包。Inventory下新建空对象ItremSlot,ItemSlot下新建Image,并复制,第一个Image命名为BackgroundImage,SourceImage选为InventorySlotBG。

     

    第二个命名为ItemImage,取消勾选其Image组件,将在用时再添加。

     

    之后把ItemSlot拽到Prefabs使成预制件,再在Hierarchy下的ItemSlot复制3次,共有4个,分别改名为ItemSlot0到ItemSlot3。

    选择Inventory添加Vertical Layout Group组件。Inventory的Width改为135,Height改为600。修改Anchor为middle & right(不摁alt或shift),然后修改Pos X为-95。

     

    Assets→Scripts→ScriptableObjects→Inventory下有已写好的Item定义脚本,如下

     

    在Scripts→MonoBehaviour→Inventory下新建Inventory脚本(添加装备&删除装备),打开并编辑

     

    然后把该脚本拖拽到Hierarchy下的PersistentCanvas,其实该脚本可以放在任何一个在该场景的gameobject上,但必须存在于此Scene里。

     

    然后打开Scripts→ScriptableObjects→Interaction→Reactions→DelayedReactions下的LostItemReaction和PickedUpReaction脚本,恢复引用Inventory脚本的语句。这是为了装备置换和捡起时把装备加到装备栏。

     

    之后在Scripts→Editor→Inventory下新建脚本InventoryEditor,打开并编辑

     

    该脚本是把Inventory脚本序列化了,没有该序列化脚本的情况下Inventory脚本组件将显示为:

     

    序列化后显示为

     

    该序列化脚本的作用不仅仅使Inventory脚本组件在Inspector上整齐了,还把Item和IemImage的索引一 一对应了。

    把对应的ItemImage拖入。

     

    保存后,点击测试到Market场景里发现Player可捡装备到装备栏并置换了。

    怎样添加Item,菜单栏Assets/Creat下有Item选项

    会在Assets文件夹下的Item文件夹里新建一个Item我们可以改名,并拖入它所对应的sprite。

     

     

     

    4.Coditions(各种互动系统的条件)

    The Phase将创建一个系统来检查当前的游戏状态。

    一个互动的游戏对象将包括

     

    Condition的形式将包括

     

    这一阶段的代码都在Package里写好。第一个脚本Scripts→ScriptableObjects→Interaction→Conditions→Condition脚本

     

    第二个脚本是同文件夹下的AllConditions

     

    注意到该脚本是继承ResettableScriptableObject的,如下

     

    接着第三个脚本,同文件夹下的ConditionCollection,这个是需要我们编辑的脚本,如下

     

    接下来我们写一个可拥有子编辑器的基础编辑器,Scripts→Editor→Abstracts下EditorWithSubEditors脚本

     

    该基础编辑器将被继承改写,它应该会做到

     

    打开Scripts→Editor→Interaction→Conditions下的ConditionCollectionEditor脚本并编辑

     

    保存后回到Unity,在SecurityRoom场景里,点击Hierarchy下的LaserGridInteractable游戏对象,在Interactable组件上,点击Add Collection按钮。填入对应的选项。并把子对象BeamsOffReaction拖入。

     

    我们上面写的一堆脚本都是为了让这个Interactable在Inspector上体现出这种层次并和游戏数据一 一对应。包括添加和移除ConditionCollection,ConditionCollection下添加和移除Condition,添加新的Reaction等等。

     

    5.Reactions(条件满足后的反应)

    将创建一个系统,当玩家点击一个Interactable对象时,可根据条件和当前游戏状态执行一系列的操作。

    1.对象(具体Reaction,Reactions,ReactionCollection,ReactionCollectionEditor)之间的关系

    Reactions可能包括如下

     

    根据Reaction的不同类型,有些反应必须有可选的延迟,而另一些必须为即时反应(比如掉出Coin,捡起后再说Oh A coin!)我们还会对Reaction做Inspector的序列化Editor

     

    所有Reaction将被封装,初始化进一个ReactionCollection脚本(包含一个public React 方法)并作为该脚本的一部分被调用。

    多态性(polymorphism)写一个基类,比如Roguelike的MovingObject,包含了该类的所有基础功能,然后有若干子类继承并改写,这些子类虽然表现不同,但他们都可归为一类。比如Enemy下有Orc,有Goblin。Goblin和Orc表现形式不同,但他们都继承了Enemy,这种通过基类子类把不同的东西提取相同属性而后加上特有属性,且他们都被归为一类来管理的方式就叫多态性。

    当游戏规模变大时,系统反应(比如更多的技能和效果,功能等)会更多,我们不能一个个的重写加上去。比如Player攻击狼人,我们新加了角色吸血鬼,难道在Player里再写入一次攻击吸血鬼吗?我们将新建一个基类Enemy,Player攻击Enemy,新加的角色都继承Enemy。它们各自的特性不同,但共性是被攻击。

    在此游戏里,Reaction的具体内容(text reaction,audio reaction...)虽然不同,但共性是被鼠标点击了就执行具体内容,所以把Reaction做成一个父类(共性是预加载内容,并执行各种反应内容)。ReactionCollection则只需对父类的Reaction操作,而无需我们新写一个Reaction就要在ReactionCollection脚本里添加一次其类型。

     

    2.制作添加具体Reaction的ReactionCollection编辑器

    打开Scripts→Monobehaviours→Interaction下的ReactionCollection脚本

     

    Reaction类将继承自ScriptableObject,它的作用就是我们在ReactionCollection的Inspector面板上明确的知道该Reaction的属性,是audio还是text之类。这样在游戏有很多Reaction时不至于拖拽管理混乱。

     

    接着我们把ReactionCollection脚本序列化,打开Scripts→Editor→Interaction下的ReactionCollectionEditor脚本。

     

    回到Unity,我们随便在某个场景,比如Market上新建一个空对象来测试,在该空对象上添加ReactionCollection脚本组件

    会出现这样的Inspector

     

    展开Scripts→ScriptableObjects→Interactions→Reactions文件夹,随便选两个拖到“Drop new Reactions here”可以看到已有的Reaction添加进来了,我们也可以摁右边的“-”来去除该Reaction的引用。我们还可以选择想要的Reaction type,选好后点击“Add Selected Reaction”就添加了新的该类型的Reaction。

     

    展开添加的Reaction我们看到添加对应的具体内容。、

     

    测试完记得删掉刚创建的空对象

     

    3.创建具体的Reaction

    Scripts→ScriptableObjects→Interaction→Reactions→ImmediateReactions 文件夹下新建脚本命名为TextReacion,打开并编辑

     

    接下来我们把上面的TextReaction序列化,在Scripts→Editor→Interaction→Reactions文件夹下新建脚本命名为TextReactionEditor,打开并编辑

     

    回到Unity,打开SecurityRoom Scene,在Hierarchy下找到PictureInteractable下的子对象DefaultReaction。它上面有一个ReactionCollection组件我们可以把TextReaction(而不是TextReactionEditor)拖拽进去【或者我们可以选择reaction type然后点Add Selected Reaction】,并改写Message为“He looks pretty trustworthy.”

     

    保存场景测试,点击墙上的图片后屏幕下方出现台词。

     

    6.Interactables

    有了Reaction(反应),有了发生反应的条件(Condition),接下来就可以开始互动了。该阶段将继续创建互动系统,侧重于互动。我们将创建一个系统来定义玩家可与之交互的内容,包括可交互的几何体,使用EventSystem并给出交互系统摘要。

    1.Interactable的架构

    一个Interactable System将处理玩家的输入,并把对应的Condition和Reaction捆绑在一起。当一个Interactable对象被点击时,Player将移动到场景里一个我们已经标记的好的特殊位置InteractableLocation。移动到InteractableLocation后Player将调用一个public Interact方法,然后根据Conditions和当前game state(游戏状态)调用合适的ReactionCollection。

    序列化后的Interactable就像下面这样

     

     

     

    Interactable序列化的形式如下

     

    就比如Guard有两个互动状态,当有Glasses & Coffee时,台词为Hi Frank,然后Laser可通过。当只有Glasses时,为Hi Frank you can't access without boss's coffee。Laser不可通过。如果这两种ConditionCollection都不满足时,只有default 反应(Get lost)。

     

    2.开始创建Interactable

    Scripts→MonoBehaviours→Interaction文件夹下新建脚本命名为Interactable,打开并编辑。

     

    因为当Player走到指定点时要调用上面的Interact方法,所以打开PlayerMovement脚本,添加如下语句

     

     

     

     

     

    接下来把上面的Interactable脚本序列化Editor,打开Scripts→Editor→Interaction文件夹下的InteractableEditor脚本

     

    保存后回到Unity,打开SecurityRoom Scene,Hierarchy下新建空对象命名为Interactable,添加Box Collider和Event Trigger组件,然后添加同名脚本作为其组件。Event Trigger上新加一个Event Type选择为Pointer Click。在新建的该事件类下点“+”添加新事件。

    再在新建的该空对象上添加两个子空对象,分别命名为InteractableLocation和DefaultReaction。

    选中DefaultReaction子对象,添加ReactionCollection脚本为其组件。

    回到Interactable对象上,把InteractableLocation和DefaultReaction子对象拖到对应的位置。

    这样,一个初始化的基础Interactable对象设置好了,把该对象拖到Prefabs成预制件。

     

    然后把刚创建的Interactable对象改名为PictureInteractable(也可以先删除Interactable,然后从Prefabs里拖出来一个改名)。修改Positon和BoxCollider的Center & Size。

     

    设置好上面的EventTrigger,拖入Player对象,选择PlayerMovement上的OnInteractableClick方法,然后把Interactable脚本组件拖入

     

    子对象InteractableLocation设为如下

     

    接着设置DefaultReaction

     

    注意PictureInteractable没有特定的ConditionCollection,每次互动都播放刚设置的默认反应。

    其他的Interactable设置,DefaultReaction设置,对应的ConditionCollection设置,AudioReaction等等都是一样的道理和操作。如有需要可在完成项目里看对应代码。

     

    7.Game State

    这一阶段学习如何用Scene Manager创建一个系统来加载场景,和保存当前游戏状态。ScriptableObjects作为临时runtime data存储,删除和lambda表达式(匿名表达式)。

    1.架构介绍

    这个将要创建的系统必须:

    1.重要的信息(比如inventory 的状态)必须在场景切换时保留。

    2.场景切换时由淡出淡入的效果。

    3.支持多个spwan points,因为可能有很多不同场景切换进此场景(比如a和c场景,切到b场景player出现的点不一样)。

    4.在卸载场景(unloading a scene )时,有些信息例如GameObject的位置必须被存储,以便在返回该场景时可以再次使用信息。(比如我们如果已经捡起了Coin,就存储信息,以免那里又有一个coin出现)

     

    2.如何实现上述功能(Approach)

    1.我们有一个Persistent Scene一直stay loaded at all times。Persistent Scene 将处理loading & unloading 其他场景。需要在所有场景中持续存在的信息比如Inventory就可以存在Persistent Scene里。

    2.Persistent Scene并不适合存一切数据,比如一些游戏对象的细节仅存在在某一个特定的场景(比如the bird)。这时候我们用ScriptableObject assets临时性的存这些数据,这样这些特定数据可以loaded again或return to a scene。

    3.场景加载架构:

    包括Scene1淡出,Scene2加深fade in

     

    4.save data 架构

    比如场景里我们想存Coin的状态。将用一个GameObjectActivitySaver脚本存作一个Scriptable object名为MarketSaveData。

    注意,ScriptableObject存数据是temporary(临时的)和runtime only(仅在运行时),它不支持store data between sessions,因为一系列我听不懂的原因^_^。

     

    3.Delegate,Events & Lambda Expressions

    1.delegate

    delegate是一种变量,它可以存储方法而不是data(如bool,int,string)。The basic Action是一个特定类型的Delegate,代表一个没有返回类型和参数的方法。

     

    Action也可以用作一般类型的delegate,下面的Action就返回空且有一个int 参数

     

    delegate最主要的用处,是他们存方法就像变量(variables)一样,所以delegate可以把方法,像传送变量一样,传送到另一个方法去。

     

    例如我们写了一个又长又慢的方法,当有必要时才调用,这时它作为一个方法传递出去并调用是不合算的(每次传进去并调用,将会有一个超长超慢的调用过程)。

    所以我们通过delegate来传递该方法,由该方法的父方法决定是否要调用该方法。

    你可以通过用 += 或 -=操作符来订阅或取消订阅delegate。这意味着可通过一个delegate添加多个函数,当调用该delegate时将调用多个函数。

     

    2.Events

    注意这里我们所说的Events和Unity里的Event System无关,它只是独立的C#内的脚本功能。这里的Event也是一种特殊的delegate。

    使用event型的delegate可以在声明时加上关键词event

    重点:event一旦被订阅(subscribed to),在摧毁前(destroy)一定要取消订阅(unsubscribeed from)。如果一直保持订阅,GC不会运行,导致内存泄漏(memory leaks)。实现它们的最好方式是在OnEnable()里订阅,在OnDisable()里取消订阅。

    调用Events和调用delegate方式相同,这将调用订阅了该事件的所有函数。

     

    event的重点在于触发类(triggering class)不需要告诉所有相关类(concerned classes)来调用特殊的方法。因为相关类可以监听一个event,然后做出相应的反应。

    event和delegate的目的在于,比如我们现在将要创建的系统:我们已经有了场景管理器,现在我们需要卸载一个场景的同时,保存一些我们需要的数据。有两种方法可以实现它们,第一种,把场景控制器关联在所有需要保存的地方,然后再一 一“通知”这些地方保存。第二种,我们定义一个卸载场景的event,让这些需要保存的地方监听(订阅)该event,当event开始unload the scene时,保存。

     

    3. Lambda Expressions

    lambda表达式是一种,将要被存在delegate里的方法的简写方式。它们的语法(syntax)如下

    因为我们用lambda简写方法,那用来写lambda的变量也很简短。变量通常是隐式类型的(implicitly typed)

    比如,x隐式的和someValue具有相同的类型。我们不知道x的类型,但知道someValue的类型,那么就能确定x的类型。

     

    下面是一些用Lambda表达式写的delegate,都非常的简短

     

    当Lambda表达式更长或多个表达式时,使用{},注意{}后面还有;。

     

    使用Lambda expressions的目的是为了简化我们的代码

     

    4.开始设置Game State

    Scripts→MonoBehaviours→SceneCotrol文件夹下,打开SceneController脚本并编辑。

     

    将会在Persistent Scene里新建一个空对象挂载该脚本。

     

    接着Scripts→ScriptableObjects→DataPersistent文件夹,打开下面的SaveData并编辑(场景切换时保存一些必要的数据)

     

    现在我们要把真正需要保存的数据(比如PositionSaver)和保存方式(SaveData)之间联系起来。Scripts→MonoBehaviours→DataPersistent文件夹下,打开Saver脚本。

     

    接下来我们看看使用Saver的具体例子,同文件夹下打开PositionSaver脚本

     

    比如读取Player的初始站位,则是SceneController

     

    完毕。

     

     

     

     

    展开全文
  • 我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是...

    我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是因为易用,他的操作非常容易,而使用的脚本语言又是JavaScript或者C#,不仅非常简单,也让各个种类的程序员都非常容易上手。再次,就是因为免费,如果你不使用Pro或者Mobile的内容的话,Unity3d就是完全免费的。还有就是对3D模型的兼容性,几乎任何3d模型都可以导入到unity中,可以说是一个很方便的特性。

     

    今天,我就来讲讲Unity3D的基础操作,这可以说是一个新手必读吧,读完之后,你一定会惊叹,原来做一个游戏这么简单。

     

    第一节 加入重力

     

    我们先打开Unity3d,新建一个场景(Scene),新建的时候应该会有对话框要求你加入哪些Asset Package,记得选择Physics Material,因为后面我们一定要用的哦亲。

     

    如果创建的时候没加,你可以再后来的Asset菜单里加:

     

     

    之后,我们建立一个Cude,调整一下x和z的大小,我这里调成了25,让它变成一个地板,你也可以放一个texture上去,看起来更加真实,我这里从简,再创建一个sphere,在component中选择Physics中的RigidBody,前提是选中你的sphere物体,之后会看到这个Sphere的inpector中加入一个component叫做RigidBody,调整好Camera运行一下,你就会发现Sphere受到重力的影响自动掉落到地板上。

     

     

    之后,通过我们之前引入的Physics Materials资源包,你还可以选择这个物体的物理性质,我这里选择Bouncy(跳跳),落下之后,这个物体就会蹦来蹦去的,呵呵

     

     

     

    第二节 检测碰撞

     

    下面我们通过简单的JavaScript语句来检测碰撞,这在制作游戏中是很有用的,比如说检测到子弹和敌人的碰撞之后,可以使用我们后来要讲到destory命令消灭敌人。

     

    这次我们新建一个Terrain项目,在用Grass贴图来覆盖住它,如果你找不到贴图的话,记得在Asset菜单里找找,看看哪些资源你还没有引入进去。

     

    然后再加入一个Cube项目,我这里叫做PlayerCube,为他加上重力,之后选择bouncy性质,然后我们再新建一个Cude,调整y和z的值让他变成一堵墙,放置好,命名为Wall,别忘了给Terrain改名为Terrain,

     

    之后我们在Asset菜单中建立一个JavaScript项目,改名为CollisionDetect,双击打开,如果你使用的是Unity 3.5的话,就会打开MonoDev,这是一个新工具还是很好用的,在其中新建一个函数,别管Start和Update函数,我们待会会讲。

     

    加入以下代码:

     

    function OnCollisionEnter(theCollision : Collision){
    
     
    
    if(theCollision.gameObject.name=="Terrain"){
    
     
    
    Debug.Log("Hit terrain");
    
     
    
    }else if(theCollision.gameObject.name=="Wall"){
    
     
    
    Debug.Log("Hit the wall");
    
     
    
    }
    
     
    
    }
    

     

    如果看不懂这些代码的话,也没关系,JavaScript是最好学的编程语言,Google一下吧,保存这个JS文件,然后拖到我们的PlayerCube上。

     

    这时候我们运行,就会看到PlayerCube到处蹦,碰到Terrain的时候,控制台就会显示Hit Terrain,碰到wall的时候就会显示Hit the wall。

     

    第三节  检测用户输入

     

    下面我们来讲一下如何检测用户的键盘和鼠标的操作。

     

    就用我们上次的那个场景,这次我们给PlayerCube加上我们可以控制的动作。就是通过“wasd”或者上下左右键来控制移动。

     

    请注意,如果要使用这里使用的方法来控制移动,那么所控制的物体不能够是一个物理世界的物体,也就是说你要把RigidBody这个component删掉,如果你想要在物理世界里移动物体的话,你就需要我们在下面会讲到的力(force)。

     

    首先我们新建一个JavaScript文件,这里命名为InputDetect吧,输入下面的代码:

     

    #pragma strict
    
     
    
    var Player : GameObject;
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    Player = GameObject.Find("PlayerCube");
    
     
    
    if(Input.GetKey(KeyCode.W)){
    
     
    
    Debug.Log("Hit w");
    
     
    
    Player.transform.Translate(Vector3.forward * 2);
    
     
    
    }else if(Input.GetKey(KeyCode.S)){
    
     
    
    Debug.Log("Hit s");
    
     
    
    Player.transform.Translate(Vector3.back * 2);
    
     
    
    }else if(Input.GetKey(KeyCode.A)){
    
     
    
    Debug.Log("Hit a");
    
     
    
    Player.transform.Translate(Vector3.left * 2);
    
     
    
    }else if(Input.GetKey(KeyCode.D)){
    
     
    
    Debug.Log("Hit d");
    
     
    
    Player.transform.Translate(Vector3.right * 2);
    
     
    
    }
    
     
    
     
    
    }
    

     

    这时,我们运行这个游戏,就可以通过“WASD”来控制PlayerCube的移动了。

     

     

    第四节 使用Prefab复制和控制物体

     

    我们可以直接把Prefab看做是个妈,她能生好多小孩,如果妈妈的DNA变了,小孩的跟着变,就是说你可以用Prefab创建物体,然后通过这个Prefab修改所有这类物体的性质,这对于批量生成的敌人或者NPC来说很有用。

     

    首先,先创建一个Prefab,我这里命名为“Mother”,之后新建一个Sphere物体,当然你也可以建一些其他的物体,之后给这个Sphere加上你想要的性质,我加入了RigidBody和Bouncy,之后将Sphere拖到Mother上,你会发现mother变蓝了,之后你就可以随意拖一些mother物体到屏幕上去,你会发现所有的Prefab创建出的物体在清单上都是蓝色的,说明他们都有共同的性质。

     

     

    当然,作用于一个Prefab上的脚本也会作用到它的子物体上去。

     

    第五节 使用Destroy命令消灭物体

     

    我们游戏中怎么能够没有敌人呢?有敌人就得能够消灭他们,这时候,我们就会使用Destroy命令了。

     

    在这里,我们使用上次Mother生出来的小球球作为敌银,一旦我们的PlayerCube碰撞到了小球的话,就是用Destroy让小球消失。

     

    新建一个JavaScript脚本,输入以下代码:

     

    #pragma strict
    
     
    
    var mother : GameObject;
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    }
    
     
    
    function OnCollisionEnter(theCollision : Collision){
    
     
    
    mother = GameObject.Find("Mother");
    
     
    
    if(theCollision.gameObject.name=="Mother"){
    
     
    
    Debug.Log("Hit mother");
    
     
    
    Destroy(mother);
    
     
    
    }
    
     
    
    }
    

     

    这段代码很好懂吧,就是检验碰撞,然后销毁碰撞到的Mother物体,别忘了把Destroy的JavaScript文件拖到PlayerCube上去。运行一下,就可以看到碰撞到的物体都被消灭了。

     

     

    第六节 使用Instantiate命令创造物体

     

    我们直接在界面创造的物体都只是会在界面被初始化的时候加载,那么,如果为了节约内存或者其他什么事情,我想要在游戏过程中添加物体,那该怎么办呢?你猜对了,就是用instantiate命令。

     

    这个命令就是英文实例化的意思,下面我们给碰撞之后消失的mother物体继续初始化一些,也就是说消灭了一些,又来了一大波···

     

    为什么非要用mother呢?因为只有拥有Prefab的物体才能够使用这个命令哦亲。

     

    function Update () {
    
     
    
    var instance : GameObject = Instantiate (PreFab,transform.position,transform.rotation);
    
     
    
    }
    

     

    注意:这样的话,每次刷新一帧都会出现一个新的mother物体,你的内存也许会受不了哦,更合理的方法是按下空格键,然后出现一个新的物体,你可以自己做吗?试试看

     

    你可能已经注意到了,每一个初始化的脚本都会默认有两个函数,就是:

    Update()函数 —— 每刷新一帧都会检查并执行

    Start()函数 —— 只在场景初始化的时候执行

     

    第七节 使用Timer计时器

     

    这次,我们要让一个计时器倒数,倒数到0的时候创建一个mother物体,来看Javascript代码吧:

     

    #pragma strict
    
     
    
    var myTimer : float = 5.0;
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    if (myTimer >= 0){
    
    myTimer -= Time.deltaTime;
    
    guiText.text=(""+myTimer);
    
    }
    
     
    
    if (myTimer <= 0){
    
    guiText.text = ("Done");
    
    }
    
     
    
    }
    

     

    把这个脚本拖到GUItext控件上,你会发现我们所期待的效果。

     

     

    第八节 让物体动起来

     

    其实让物体行动的技巧,我们已经会了,不是吗?

     

    如果你觉得不是的话,没有认真的看上面的文章哦,我就再给你讲一次吧。

     

    请特别注意,这种方法不适合物理世界的物体,如果向移动物理世界的物体,请看下一节:

     

    创建一个Cylinder物体,之后将下面的脚本附着在上面。

     

    #pragma strict
    
     
    
    var myObject : GameObject;
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    myObject.gameObject.Find("Cylinder");
    
    myObject.transform.Translate(Vector3(0,0,1));
    
     
    
    }
    

     

    第九节 使用物理世界的力

     

    这里是我们讲移动物体的重点,因为大部分的物体移动都是在物理世界完成的,而如果想要在物理世界移动东西,除了position和rotation的移动之外,就是使用“力”了,在高中学过经典物理学的人都知道,要使物体用移动,木有力是不行的,那么我们就开始吧,再新建一个什么物体,我新建了一个Capsule。

     

    之后,我会在这个物体的上方加一个力,让它用力的向下飞,触碰到地之后,通过bouncy这个性质再弹回来。新建一个JavaScript文件,就叫做Force吧,加入如下代码:

     

    #pragma strict
    
     
    
    var Power : float = 500.0;
    
     
    
    function Start () {
    
     
    
    rigidbody.AddForce(Vector3(0,Power,0));
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    }
    

     

    运行之后,会发现capsule其实是个很有幽默感的物体。

     

     

    第十节 使用贴图和材质

     

    贴图和材质能够使你的虚拟3D世界看起来更加真实,不幸的是,需要大量在PS和AI中的设计工作,最近我一想到要打开PS就有点烦···呜呜。

     

    闲话少说,我已经做好了一个贴图,怎么使用在材质上呢?之后我们怎么才能通过材质使用到其他物体之上呢?

     

     

    就像你看到的一样,我是直接拖进去的···

     

    之后我们从新建菜单中选择Material这一项,之后选中material,将贴图拖进material的贴图选框里,之后,就可以拖动这个Material赋给任何物体了。

     

     

    第十一节 使用声效和音乐

     

    音效和音乐对于一个游戏来说是非常重要的,一个寂静无声的世界是无聊的,而且不真实,什么?你说声效和音乐是一个东西?那你就错了,声效是,比如说发射子弹的声音,什么东西爆炸的声音等等,而音乐则是背景音乐什么的,不一样的亲。

     

    对于音乐来说,往往使用立体声音乐,而对于生效来说,我们随便使用一个简单的音乐文件就可以了。

     

    想要在Unity3D中播放音乐,你需要两样东西,一个是监听器,一个是音乐源,监听器是Camera的一个组件,所以你不用担心,你唯一需要增加的就是音乐源。

     

    直接将项目中的音乐拖放到Audio Source项就可以播放,但是如果我们想要在某个特定的点上 播放音乐该怎么办呢?答案就是,写一个脚本,新建一个脚本,输入如下代码:

     

    #pragma strict
    
     
    
    var myClip : AudioClip;
    
     
    
    function Start () {
    
     
    
    AudioSource.PlayClipAtPoint(myClip,transform.position);
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    }
    

     

    之后将这个脚本拖放到我们的物体上,最后,将音频文件拖放到AudioSource选项框中。

     

    第十二节 使用关节

     

    关节在3D游戏之中的应用非常广,主要在于物理世界的重力影响,下面我们就通过关节来制作一个钟摆。

     

    这次我们新建一个场景,松了一口气?刚才的场景是不是太乱了?你做的时候可以整理一下嘛,呵呵

     

    新建一个cube作为地面,之后一个cube放在上空作为摆垂,之后用几个capsule分别用component中的fixed joint连接起来,之后最上面的那个capsule与世界相连,使用Hinge Joint,这样的话,他会默认与世界相连,不用担心,看图

     

     

     

    第十三节 使用Axes

     

    在Edit – Project Setting – input 中可以查看各种形式的input,这些input方法在unity中被叫做Axes。

     

    我们创建一个JavaScript,叫做GetAxes,输入以下内容:

     

    #pragma strict
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    var Honriz : float = Input.GetAxis("Honrizontal");
    
     
    
    Debug.Log(Honriz);
    
     
    
    }
    

     

    在拖放脚本之后,运行这个场景,看看控制台输出了什么,你就明白了。

     

     

    第十四节 使用触发器

     

    触发器一般用于检测一个物体是否处于一个空间内,他是怎么做到的呢?

     

    首先,他创造一个大的物体,之后将他的randerer属性去掉,他就隐形了,这样,我们再把他的isCollide属性去掉,他就不会发生碰撞了,之后,我们只需要用脚本检测物体是否与这个物体碰撞就可以了。

     

    我们新建一个场景,做一个地板,再做一个底座,叠加起来,再在他们的上空做一个方块,设置rigidbody属性,将底座设置成为我们刚才说的那种隐形的状态,之后新建一个JavaScript脚本,输入代码

     

    #pragma strict
    
     
    
    function Start () {
    
     
    
    }
    
     
    
    function Update () {
    
     
    
    }
    
     
    
    function OnTriggerEnter (myTrigger : Collider) {
    
     
    
    if(myTrigger.gameObject.name == "box"){
    
    Debug.Log("Hit");
    
    }
    
     
    
    }
    

     

    按下运行,会发现可以检测出Hit。

     

     

    第十五节 使用GUI

     

    其实我们已经学过了如何使用GUI text,不信,我们就用屏幕上的字代替我们在上面的程序中的Debug.Log现实的内容。

     

    你自己能做吗?

     

    试试看吧,一个下午写了这么多,有点累。

     

    一定要在Unity中加入一个GUI Text,运行一下,就会发现屏幕上的GUI Text会随着你设定的的内容而变化了。

    失败是什么?没有什么,只是更走近成功一步;成功是什么?就是走过了所有通向失败的路,只剩下一条路,那就是成功的路。
    展开全文
  • Unity3D】Helloworld

    2017-04-24 10:22:40
    Unity3D有个好处,是兼容往下的版本。这一点起码比起隔壁的Cocos2dx好多了,Cocos2dx现在都不知道更到什么版本了,3.x只能用VS2012以上的版本玩就算了,还和2.x的语法与配置大相径庭;另外,大家熟悉的SSH三大框架...

    这个游戏引擎大名鼎鼎,容易学,能很快弄出很多好玩的游戏。Unity3D有个好处,是兼容往下的版本。这一点起码比起隔壁的Cocos2dx好多了,Cocos2dx现在都不知道更到什么版本了,3.x只能用VS2012以上的版本玩就算了,还和2.x的语法与配置大相径庭;另外,大家熟悉的SSH三大框架现在更到面目全非,各位玩JAVAEE的都懂……Unity3D其实也和SSH一样,不是版本越新越好,虽然现在Unity3D已经出到5.x了,但4.x才是资料最多,版本最稳定,关键是使用者最多的版本。网上流传着一句话,至少让Unity3d出到当前系列的完整版才用,不然各种坑爹bug弄死你。Unity3d 4.x照样有5.x的各种常用功能,没必要最新的。

    一、Unity3D 4.x下载、安装、配置

    0、安装之前,最好自己先装好VS2010。我用的是cn_visual_studio_2010_ultimate_x86_dvd_532347.iso,大家自己找下,毕竟Unity3D的脚本,基本上是用C#来写的。

    1、其实Unity3D的下载还是有点复杂的,不过国外网站都这样,和Ubuntu的下载差不多,不是说我是抱残守缺,但新版本我不能说用就用,你给我加了许多特效那就不好了,另外,在线安装是什么意思?你不知道我们这里的网络装个.Net Framework、Android SDK都蛋疼的要死,甚至DirectX和Nvidia显卡驱动必须先拔网线的吗?

    所以一般步骤,进入Unity3D的官网:https://unity3d.com/,如下图操作,选择Older versions of Unity获取旧有版本的JDK,这样就不用下载一个下载器。

    2、找到我们的Unity4.x版本的最后一般,直接下载Unity编辑器即可。这个版本比起坑爹的5.x,需要注册,又没有离线模式好多了。


    3、下载之后的安装是无脑的下一步的安装,不过有几个位置需要注意下。

    完整安装是肯定的,毫无疑问。难道以后用到,你还慢慢重装一次,别这么傻。


    然后安装位置这里,安装路径是带Unity\Editor的,不仅仅只有Unity这个根目录的,是的,你没有看错,这里\Editor请不要强迫症去掉,因为你以后这个Unity根目录可能要装些其它支持组件什么的。


    还有就是装完就不要让它直接运行了,我们还要搞些事情。


    4、还需要UniPatcher_v2017.4.exe这种工具弄一下Unity3D,我已经给大家上传了一份:http://download.csdn.net/detail/yongh701/9810237。毕竟Unity3D是类似visual studio一样是要给钱的,作为一个初学者,在我朝这样的土壤里面,先上车后付费大家都懂了吧~

    点击Browse选择,刚才你在安装Unity3D\Editor那个目录!


    然后点击PATCH,等一下就好,等到弹出对话框,提示成功和谐Unity3D,就可以关闭这个工具,直接打开桌面上的Unity3D。

    如下图,选择Create New Project,设置好工程所在的路径,点击“Create”开始开发。


    二、Unity3D的Helloworld

    Unity3D的Helloworld分为两种,一种是纯拖界面的Helloworld、另一种是脚本的Helloworld。

    1、纯拖界面的Helloworld

    这也是传说中UGUI的内容。自从Unity 3D 4.6之后开始支持。类似C#开发窗体那样拖个Label标签的意思。下面是具体步骤。

    (1)如图,选择GameObject->UI->Canvas设置一个“帆布”,其实就是一张画纸,我们上来先做2D。不要以为2D不叫事,现在任何大作的开始菜单、选项菜单,不还还是2D吗?


    (2)之后我们切到Unity3D的2D开发界面,如图。


    (3)我们再于Canvas之上(保证现在Hierarchy界面选择的是Canvas而不是其它)添加一个Text。


    (4)在属性界面设置字号,你有兴趣还可以改改颜色什么的,利用矩形工具设置大小,利用移动工具将其移到Canvas的中央。


    (5)点击上方的播放按钮查看最后的效果。


    2、Unity3D脚本的Helloworld

    这里的意思是,我们通过编写脚本(程序)来创建一个组件。

    1、新建工程之后,在Project窗口选择【Assets】,然后按右键选择【Create】→【C# Script】创建一个新的C#脚本,将脚本命名为Script,其实这个名字也是随便改的,如图所示。


    之后在VS2010写下如下的一段代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Script : MonoBehaviour
    {
    
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
    
        void OnGUI()
        {
            //改变字体大小  
            GUI.skin.label.fontSize = 120;
            //定位显示(左边距x, 上边距y, 宽, 高)  
            GUI.Label(new Rect(10, 50, 900, 120), "Hello World!");
        }
    }
    
    默认函数Start可以理解为初始化函数,Update函数为触发函数,每一帧动作时被执行,OnGUI函数用于绘制UI界面。

    3、之后我们要将这个脚本附着到主摄像机里面,也就是让摄像机执行这个脚本。


    4、之后可以直接点击上方的运行预览下效果。

    三、Unity3D工程的发布

    1、至此,Unity3D的Helloworld开发完毕了,但玩家需要拿到的一个exe,而不是这些,那么如何发布呢?需要将前面的劳动成果保存一下。在菜单栏选择【File】→【Save Scene As】将当前关卡保存在Asset目录内,命名为Hello World。可以看到,我们一共创建了两个文件:一个是脚本文件;另一个是关卡文件,如图所示。


    2、在菜单栏选择【File】→【Build Settings】打开Build Settings窗口,选择【Add Open Scenes】将当前关卡添加到Scenes In Build下面的框中(也可以直接将关卡文件拖入框中),还可以在Build Settings窗口选择【PlayerSettings】,进行更多设置。如图所示。在Build Settings窗口选择【Build】,然后选择保存路径即可将程序编译成独立运行的标准Windows程序。

    3、双击刚才发布的Helloworld.exe,进行一些基本的游戏设计之后,则可以看到如下的效果。这Helloworld简直好玩。

     


    其实纵观整个过程,初始接触Unity3D感觉就像以前在Flash写ActionScript,这里面的场景概念,还有摄像机、光照场景分明就是当年的Flash的2D舞台换成了3dsmax,只是Unity3D用了更多人熟悉的C#来写脚本。所以嘛,Unity3D现在的香火会这样鼎盛,其实还是传承了Flash的一些东西。比起用C++来写语言,无可视化界面的Cocos2dx在这方面不得不说是她的优势所在!


    展开全文
  • 一、Unity的下载安装 1.打开网址:https://unity3d.com/cn/,注册并登陆,点击“获取Unity” 2.点击“Try Personal” 3.点击“Download Installer” 4.双击运行并安装 ...2.unity项目窗口
  • 如果您想让自己的Unity3D游戏在发布到苹果的App Store或者谷歌的Google Play商代后具备获利赚钱的功能,首先就可以考虑在自己的游Unity戏工程中添加Unity系列的广告,然后诱使玩家并在合适的时机播放,玩家在观看...
  • Unity3d的安装

    2019-06-19 09:46:45
    Unity3d的安装 ** 1.在线安装 a.获取在线安装程序 第一步:进入官网:https://unity.com/cn 第二步:在主页的底部点击下载 第三步:来到UnityStore,拖到该页面的最底部,点击资源下面的Unity旧版本 第四步:来到Unity...
  • Unity3D 2018安装教程

    2019-06-15 21:42:20
    安装步骤: ...Unity2018.3.0相较2017版本的在启动时稳定了很多(2017版本启动经常会卡在loading界面) 如果启动Unity2018.3.0时一直卡在loading界面进不去,可以尝试以下两种解决办法: 1.1:将计算...
  • 本章主要是 Unity3D 的基础快速入门篇,通过本章的学习,能让初学者们快速的掌握和 应用 Unity3D 软件。 本章导读 本章无论对于 Unity3D 初学者、或是以前从事建模工作的设计师、又或者是从事过 3D 编程的人群,...
  • Unity3D】自学之路2.0

    2020-04-07 08:40:42
    一、前言 原文主要讲的是如何从零基础入门,然后一步一步进阶的文章,包括很多学习资料,学习的网址,研究方向等,内容还是比较全面的。大家多多支持一些克森大神,关注一下他的公众号。这篇文章就将原文的内容...
  • 每周更新unity3d视频教程,从入门到就业,官方unity3d培训,上千门实时更新课程,供学员在线观看学习,unity3d游戏开发,可以让学员随时随地学习! 免费网上学习unity3d自学教程,国内名师机构专业授课,O基础快速学习,1小时...
  • 今天我们来说说通过反编译Unity3D的AssetBundle来提取游戏资源,博主写这篇文章的目的并非是要教大家如何去破解一款基于Unity3D引擎开发的游戏,而是想通过今天这篇文章来告诉大家如何在开发Unity3D游戏的过程中保护...
  • 我翻译的Unity3D书籍终于出版啦。特点:1、针对Unity52、如何使用Unity3D编辑器只是简略带过3、重点讲如何在Unity3D中编写质量更高的代码4、以游戏实例引导你开发游戏5、各种图片、音频资源格式的特点和针对平台的...
  • 掌握Unity3D开发技术是不可跳过的一环。随着移动互联网的发展,移动端游戏日益盛行,据了解,Unity全球开发者超过300万,1/4在中国,超过5000家游戏公司和工作室在使用Unity3D开发。学习Unity3D游戏开发,未来职业...
  • 2018年什么游戏最火? 不用问,肯定是人人都在撸的“王者荣耀”和吃鸡游戏了。...Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综...
  • MAC中开发Unity3D

    2016-03-23 16:21:29
    一直想做3D开发,去年后半年开始学IOS下的OpenGL,只学会了纹理,而且灯光音效什么的好麻烦,于是想学学Unity3D。 今年年初就计划上了,可是Unity3D收费,费用不便宜呢。用Unity3D开发了游戏也不能上传AppStore,...
1 2 3 4 5 ... 20
收藏数 103,316
精华内容 41,326
关键字:

unity3d