Unity3D游戏日记 (1):漫游的琥珀

前言: “游戏场景”可以有多种概念,为了防止语义混淆,以下内容中专指 Unity 中的场景组件时使用 “Scene”,而讨论一般意义上的场景,如代表游戏中的地形的三维物体,使用 “场景”。Unity chan 使用其设定名大鸟琥珀。游戏人物在多场景活动的方案Unity 使用了 Scene 这一概念加载游戏资源,一个 Scene 相当于一个小世界。原则上 Scene 本身的加载和销毁伴随...
摘要由CSDN通过智能技术生成

前言:

  • “游戏场景”可以有多种概念,为了防止语义混淆,以下内容中专指 Unity 中的场景组件时使用 “Scene”,而讨论一般意义上的场景,如代表游戏中的地形的三维物体,使用 “场景”。
  • Unity chan 使用其设定名大鸟琥珀。
  • 关于控制角色移动和镜头脚本,可以参考<这里>和<这里>。

游戏人物在多场景活动的方案

Unity 使用了 Scene 这一概念加载游戏资源,一个 Scene 相当于一个小世界。原则上 Scene 本身的加载和销毁伴随着 Scene 内所有物体的加载和销毁。但也可以为某个 GameObject 物件指定标记,阻止这个物件因为 Scene 销毁而被销毁,形如:

 void Awake()
 {
     DontDestroyOnLoad(gameObject);
 }

对一个 GameObject 物件,在 Unity 编辑器中表示为一个节点。如果阻止某个节点随 Scene 销毁,那么其所有的子孙节点都不会随 Scene 销毁。

在“存在一个玩家和若干个 Scene”的情况下,除了为每一个 Scene 都保存一个玩家角色,也可以为玩家角色单独创建一个 Scene,而其他 Scene 中都没有玩家角色,这样玩家角色可以跨场景使用,保存在角色身上的信息可以不经过额外的处理一直持续,制作者也能专心编辑场景。

除了玩家角色 (包含角色模型、角色脚本和控制器脚本),观察玩家的镜头甚至 UI 组件都可以组装在一个节点下,形如:

 根节点 (挂载管理器脚本,阻止节点随场景转换而销毁)
    *- 摄像机 (包含摄像机组件和控制摄像机的脚本)
    *- 玩家 (包含角色模型、动画组件、角色脚本和控制器脚本等)
    *- UI (包含所需的 UI 组件和脚本,别忘了保持 EventSystem 在根节点下)

管理器脚本除了阻止节点被销毁,还可以有更多用途,如控制加载或销毁的游戏场景,在游戏存档时向配置文件写入保存信息等。
1-1

把身高一米五的大鸟琥珀模型、控制器、动画状态机和一些其他组件装在一个根节点下,根节点挂管理器脚本设置不随 Scene 转换销毁,然后在管理器或者别的什么地方设置你的第一个有地面的 Scene 然后加载那个 Scene,从玩家 Scene 启动……
1-2

Unity 会将所有带 DontDestroyOnLoad 标记的物件放在一个同名节点下,而最后一个被加载的 Scene 内还没有被销毁的物件单独放在一处。

现在我们有了能够出现在其他场景中的玩家角色,就可以让这个角色在不同场景间漫游了。创建多个游戏场景的思路有两种:一种是使用一张邻接表管理所有的节点,场景可以表示为 Scene 或者预制体,由一个管理器脚本维护当前所在的场景及与其相邻的场景,保持这些场景在加载并销毁那些不和当前玩家所在场景相邻的场景块,下面的例子中我会使用多个 Scene 的方案。而另一种思路是确保同一时间内只保持一个含有地形的 Scene 被加载,两个相邻的 Scene 有重叠的接缝,需要一些视觉技巧防止切换 Scene 时穿帮。

使用同时加载多个 Scene 的方法时,需要使用一张邻接表维护所有 Scene 的连通性。邻接表可以表示为字典形式,用某个 Scene 的名称 (比如A) 当作键,而从场景A出发,与场景A相邻的所有 Scene 的名称装在一个列表内,作为值,形如:

public Dictionary<string, List<string>> SceneEdges { get; private set; } 

初始化邻接表的动作应该在游戏开始之前,而游戏运行时内这张表不应该再被改动。你可以通过读取配置文件的方式导入信息。比如你有五个游戏场景A、B、C、D、E,A连接B和C,B连接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值