项目实训unity游戏场景的搭建

Posted 珍珠没有奶茶^_^

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目实训unity游戏场景的搭建相关的知识,希望对你有一定的参考价值。

文章目录


前言

`

unity场景的搭建


一、组件的介绍

首先对scene场景中的一些组件介绍:

常用快捷键

1.按下鼠标滚轮拖动场景(或者拖动小手),滑动滚轮缩放场景

2.选择十字标,选定物体,按下F:居中,ALT+鼠标左键:围绕旋转 ALT+鼠标右键:缩放=滑动滚轮

3.右键加ASDWQE场景漫游

4.按下十字标,选定物体,拖动轴:往前走=向着Z轴正方向,向右走=X轴正方向,向上走=Y轴正方向:反之负方向。拖动面:沿面移动。

5.按下双曲箭头标,是按轴旋转。

6.按下方框和四个箭头的标,是放大缩小,拖动中间白色小方框是整体按比例放大缩小。

7.inspector:检视面板(检查监视)显示的属性可能不准,在右上角static上边的小三杠选择Debug可以查看隐藏属性,在里面找到要修改的属性的真正名称

transform 变换组件 reset 重置

Position :位置 X 0 Y 0 Z 0 unity世界原点

Rotation :角度X 0 Y 0 Z 0 角度同世界一致

Scale: 比例 (一般X 1 Y 1 Z 1)

unity世界物体都是由小三角组成,物体越细腻小三角越多。

顶点吸附:按下V同时按下左键拖动,实现顶点吸附

视觉停留效应:0.02S以内视觉感受不到更新

2D视角:ISO正交模式3D视角:Persp 透视模式

8.Ctrl+1 切换到scene视图 Ctrl+2切换到Game视图 Ctrl+3切换到Inspector视图 Ctrl+4切换到Hierarchy视图

9.光照系统
GI(Global illumination),即全局光照。能够计算直接光、间接光、环境光(ambient)以及反射光(reflection)的光照系统。通过GI算法可以使渲染出来的光更加真是丰富。

直接光照
直接光照:directional平行光和位置无关和角度有关。point点光源相当于一个灯泡,range:范围。sport聚光灯:由一个点像一个椎体照射,相当于手电筒。

物体阴影在光源选项组件里。硬阴影性能比软阴影好。阴影很消耗性能,所以需要阴影剔除。
shadowdistance(阴影距离):如果等于40则等于距离摄像机40米以内渲染阴影,40米以外不渲染阴影。

选中个别物体,可以在组件中选择关闭阴影

环境光照
环境光照ambient source:所有物体都能感受到的光照。

作用于场景内所有物体的光照,通过EnvironmentLighting 中Ambient 控制。

•AmbientSource 环境光源

–Skybox 通过天空盒颜色设置环境光照

–Gradient 梯度颜色

Sky 天空颜色、Equator 地平线颜色、Ground 地面颜色

–Ambient Color 纯色

•AmbientIntensity 环境光强度

•AmbientGI 环境光GI模式

–Realtime实时更新,环境光源会改变选择此项。

–Backed 烘焙,环境光源不会改变选择此项。

反射光照
反射光照resolution source:从天空盒中取色。

根据天空盒或立方体贴图计算的作用于所有物体的反射效果,通过EnvironmentLighting 中Reflection 控制。

•ReflectionSource 反射源

–Skybox 天空盒

Resolution 分辨率Compression是否压缩

–Custom 自定义

Cubemap立方体贴图

•ReflectionIntensity 反射强度

•ReflectionBounces 使用ReflectionProbe 后允许不同游戏对象间来回反弹的次数。

间接光照
间接光照:物体表面在接受光照后反弹出来的光。(特别消耗性能)

通过Light 组件中BounceIntensity 反弹强度控制。

可以通过Scene 面板Irradiance 模式查看间接光照。

注意:只有标记Lightmaping Static的物体才能产生间接光。

10.声音
声音分为2D、3D两类

3D声音:有空间感,近大远小。

2D声音:适合背景音乐。

· 在场景中产生声音,主要依靠两个重要组件:

Audio Listener 音频监听器:接收场景中音频源Audio Source(音频源)发出的声音,通过计算机的扬声器播放声音。

音频监听器在摄像机组件中,场景中只能有一个音频监听器。如果有多个摄像机,那只能留一个,要把别的摄像机的音频监听器组件移除remove。
其实Audiosource 和 AudioListener 在游戏场景中的关系就是:一个用于播放声音,一个用于听(listen)声音,一个场景中只有一个 AudioListener 也很好理解,因为对于游戏来说一个客户端只针对一个玩家,所以一个玩家拥有一个 Listener 才符合实际。但是声音可以是多种多样的,所以 AudioSource 组件上可以有多个并且可设置声音的相关属性。

11.碰撞体
(1) Box Collider(盒碰撞体)。
  盒碰撞体是一个立方体外形的基本碰撞体。该碰撞体可以调整为不同大小的长方体,可用作门、墙及平台等,也可用于布娃娃的角色躯干或者汽车等交通工具的外壳,当然最适合用在盒子或箱子上。

(2) Sphere Collider(球形碰撞体)。
  球形碰撞体是一个基本球体的基本碰撞体。球形碰撞体的三维大小可以均匀地调节,但不能单独调节某个坐标轴方向的大小,该碰撞体适用于落石、乒乓球等游戏对象。
中的位置。
Radius:半径。球体碰撞体的半径。

(3)Capsule Collider(胶囊碰撞体)。
  胶囊碰撞体由一个圆柱体和与其相连的两个半球体组成,是一个胶囊形状的基本碰撞体。胶囊碰撞体的半径和高度都可以单独调节,可用在角色控制器或与其他不规则形状的碰撞结合来使用。Unity中的角色控制器通常内嵌了胶囊碰撞体。

(4) Mesh Collider(网格碰撞体)。
  网格碰撞体通过获取网格对象并在其基础上构建碰撞,与在复杂网格模型上使用基本碰撞体相比,网格碰撞体要更加精细,但会占用更多的系统资源。开启Convex参数的网格碰撞体才可以与其他的网格碰撞体发生碰撞。

(5)Wheel Collider(车轮碰撞体)。
  车轮碰撞体是一种针对地面车辆的特殊碰撞体。它有内置的碰撞检测、车轮物理系统及有滑胎摩擦的参考体。除了车轮,该碰撞体也可用于其他的游戏对象。

(6)Terrain Collider(地形碰撞器)。
  地形碰撞器是基于地形构建的碰撞体。

二.场景搭建

首先引入一个场景的资源,然后通过各种拖动,变换,复制,以及预制体的运用,新建一个空物体,把他们拖到同一个物体下,可多种整体运用。
制作预设:Prefab
要把素材整合包装成预设,以草地方块预设为例。
在Hierarchy视图空白处右键鼠标,点击菜单Create Empty,创建一个空物体,

重命名为grass,

再在它的子节点下创建一个空物体,重命名为mesh,

给mesh节点添加MeshFilter、MeshRenderer和MeshCollider组件,

给MeshFilter组件的Mesh赋值方块Mesh,给MeshRenderer组件的Material赋值草的材质球grass,如下

此时效果如下:

将其保存为预设,放在Prefabs目录中,同理制作其他方块预设
最终如下:

最终成果:


成果如下:


总结

以上就是今天要讲的内容,本文简单介绍了scene的一些组件以及场景如何做成自己需要的样子。

Unity游戏框架搭建 概述

??为了重构手头的一款项目,翻出来当时未接触Unity时候收藏的视频《Unity项目架构设计与开发管理》,对于我这种初学者来说全是干货。简单的总结了一下,以后慢慢提炼。

关于Unity的架构有如下几种常用的方式。

1.EmptyGO:

??在Hierarchy上创建一个空的GameObject,然后挂上所有与GameObject无关的逻辑控制的脚本。使用GameObject.Find()访问对象数据。
缺点:逻辑代码散落在各处,不适合大型项目。

2.Simple GameManager:

??所有与GameObject无关的逻辑都放在一个单例中。

缺点:单一文件过于庞大。

3.Manager Of Managers:

将不同的功能单独管理。如下:

  • MainManager: 作为入口管理器。
  • EventManager: 消息管理。
  • GUIManager: 图形视图管理。
  • AudioManager: 音效管理。
  • PoolManager: GameObject管理(减少动态开辟内存消耗,减少GC)。

实现一个简单的PoolManager

// 存储动可服用的GameObject。
private List<GameObject> dormantObjects = new List<GameObject>();  
// 在dormantObjects获取与go类型相同的GameObject,如果没有则new一个。
public GameObject Spawn(GameObject go)  
{
     GameObject temp = null;
     if (dormantObjects.Count > 0)
     {
          foreach (GameObject dob in dormantObjects)
          {
               if (dob.name == go.name)
               {
                    // Find an available GameObject
                    temp = dob;
                    dormantObjects.Remove(temp);
                    return temp;
               }
          }
     }
     // Now Instantiate a new GameObject.
     temp = GameObject.Instantialte(go) as GameObject;
     temp.name = go.name;
     return temp;
}

// 将用完的GameObject放入dormantObjects中
public void Despawn(GameObject go)  
{
     go.transform.parent = PoolManager.transform;
     go.SetActive(false);
     dormantObject.Add(go);
     Trim();
}

//FIFO 如果dormantObjects大于最大个数则将之前的GameObject都推出来。
public void Trim()  
{
     while (dormantObjects.Count > Capacity)
     {
          GameObject dob = dormantObjects[0];
          dormantObjects.RemoveAt(0);
          Destroy(dob);
     }
}

缺点:

??(1)不能管理prefabs。

??(2)没有进行分类。


更好的实现方式是将一个PoolManager分成:

??若干个 SpawnPool。

??每个SpawnPool分成PrefabPool和PoolManager。


??PrefabPool负责Prefab的加载和卸载。

??PoolManager与之前的PoolMananger功能一样,负责GameObject的Spawn、Despawn和Trim。

要注意的是:

??(1)每个SpawnPool是EmeptyGO。

??(2)每个PoolManager管理两个List (Active,Deactive)。

讲了一堆,最后告诉有一个NB的插件叫Pool Manager- -。

*LevelManager: 关卡管理。

推荐插件:MadLevelManager。

GameManager: 游戏管理。
??C#程序员整理的Unity 3D笔记(十二):Unity3D之单体模式实现GameManager

  • SaveManager: 配置管理。

  • 实现Resume,功能玩到一半数据临时存储。

    推荐SaveManager插件。可以Load、Save均采用二进制(快!!!)

    ??所有C#类型都可以做Serialize。

    ??数据混淆,截屏操作。

    MenuManager 菜单管理。

4.将View和Model之间增加一个媒介层。

MVCS:StrangeIOC插件。

MVVM:uFrame插件。

转载请注明地址:凉鞋的笔记

微信公众号:liangxiegame
技术分享




















































以上是关于项目实训unity游戏场景的搭建的主要内容,如果未能解决你的问题,请参考以下文章

Unity游戏框架搭建 概述

自然语言交流系统 phxnet团队 创新实训 个人博客

为啥unity搭建的场景是紫色的

项目实训—基于AI的智能视频剪辑器项目架构搭建

Unity3D益智三消类“快乐消消乐”(产品级)实战

开源项目MLAPI正式加入Unity