摄像机

Main Camera

跟随主角移动,不看 UI

剧情摄像机

当进入剧情时,可以关闭 main camera,启用剧情摄像机,不看 UI

UI 摄像机

看 UI

Unity编辑器常用的settings

  • File->Build Settings
  • File->Build Settings->Player Settings
  • File->Build Settings->Player Settings->Other Settings
  • Edit->Project Settings

坐标

  • Unity 中 Z 轴朝前(在本地坐标中)
  • 默认在 Transform 中看到的是本地的坐标,角度,缩放

控制器

分类

  • 主角控制器(移动,打怪 )
  • 怪物控制器(巡逻,打主角)
  • NPC 控制器(没有 AI,没有移动,仅仅是发布任务等简单的功能)

精灵(Sprite)

包括

  • 主角
  • Boss
  • 怪物
  • NPC

目录结构

特定

  • Editor:放在此下面的脚本在创建 C# 脚本时会调用,可以实现自定义模板
  • Plugins/iOS/PC
  • Resources:预制体放在此目录下用于加载
  • StreamingAssets:在游戏运行时此目录是只读的
  • Hierachy:场景物体

通用

  • Editor
  • Plugins/iOS/PC
  • Resources
    • Role
    • UI
  • StreamingAssets
  • Audio
  • Effects
  • Scripts
    • Role

      • FSM(状态机)
      • UI
      • Utils
  • Scenes
  • Hierachy
    • Scene
    • Lights
    • UI Root(NGUI 插件要求,如果要发布到移动平台,需要将Scaling Style 改为 Constrainted On Mobiles,ContentHeight 为 720 并打上对勾,Content Width 为 1280,为了在开发时可以看到效果,在 Game 视图中添加 1280x720的分辨率并使用)
    • Roles
      • NPCs
      • Global(存放全局)

tag

  • 用于查找物体

layer

  • 用于检测碰撞
  • 默认都为 default layer 中
  • 层之间的碰撞关系在 Edit->ProjectSettings->Physics->Layer Collision Matrix, 默认都是打上勾的,根据需要打勾

射线

API

Raycast

如果中间被挡住了就不会继续了

RaycastAll

射线一串到底

Physics.OverlapSphere(pos, radius, layerMask)

检测周围

图集(atlas)

创建

  • 导入 NGUI 插件
  • NGUI->Open->Atlas Maker, 在 assets 中选择需要创建的图集的图片,在 Atlas Maker 中会出现对应的列表,为了优化,我们需要创建正方形(且边长为2的幂次方)的图集,所以去掉 Unity Packer,选择 Force Square

用途

整理 UI 的需要的图片

优化

  • 选择需要优化的图集
  • 在属性面板中 Texture type 选择 Advanced
  • 去掉 Generate Mip Map 的勾
  • 点击 Apply

设计原则

UI

  • 创建 UIViewBase,UIVIewWindowBase,UIViewSceneBase 表示View

UIViewBase

添加OnAwake,OnStart,OnUpdate,OnDestroy等虚方法用于被子类继承,继承MonoBehavior,UIBase 中的Awake,Start,Update等分别调用 Onxxx方法

  • ResourceManager,SceneManager,WindowManager,UILayerManager作为单例对象全局使用,ResourceManager 封装 Resouces.Load,SceneManager 和 WindowManager 封装ResourceManager

SceneManager

  • 场景切换
  • 封装 SceneManagement

UILayerManager

  • 设置层级
  • 添加 canvas 子组件,设置order

ResourceManager

  • 封装 Resources.Load,终于加在预制体,如果加载场景,使用SceneManagement.LoadScene

RoleManager

  • 加载人物(Player,NPC)
  • UI 加载路线
    • SceneInit->SceneLoading->SceneLogin
    • 跳转到下一个场景的时候应该有一个通用的Loading场景,在Loading中的脚本中根据传入的参数判断SceneManagement.LoadSceneAsync哪个资源(进度条)
  • 当UI和人物联系比较强的时候(人物昵称跟随)
    • 不要将UI直接放到人物上,原则是游戏对象和UI应该分开来放
    • 在要放置UI的人物的地方创建一个EmptyObject用于定义
    • 在UI层级下创建Label,再通过脚本定位

组件

进度条

  • 配合UIProcessBar,SceneManagement.LoadSceneAsync实现(去网上找实现)

LoadingScene

  • 配合进度条

Username跟随

  • 见上文

文字上弹(HUD插件)

  • 调用 HUD Text 插件

人物

  • RoleController(添加Unity自带的CharacterController碰撞体)

    • 包含AI(AI接口)

      • 人物AI
      • 怪物AI
        • 出生点
        • 巡逻范围
        • 视野范围
        • 锁定敌人
        • 巡逻间隔
        • 包含FSM(状态机),什么样的状态播放什么样的动画并且有什么逻辑操作(FSMController)
          • 定义状态(类和enum)

            • Idle
            • Run
            • 攻击
            • 受伤
            • 死亡
            • 等等
            • 状态分为几个阶段,都作为我们回调函数
              • OnEnter
              • OnUpdate
              • OnExit
              • FSMController
                • ChangeState
                • ToIdle
                • ToRun
                • ToAttack
                • ToDie
                • ToHurt
                • MoveTo
              • RoleInfo
                • RoleInfoBase

                  • Hp
                  • Mp
                  • ServerId
                  • UserId
                  • 主角
                  • 怪物

灯光

  • 场景中自然光源一个主一个辅助
  • 大量使用点光源
    • Roads
    • Plants
    • Buildings
    • Miscs
  • 光源都是baked的
  • Window->Lighting->烘焙

设计模式

单例

继承MonoBehavior的类

代码

public static 类 _instance;

public 类 Instance()

{

if (_instance == null)

{

GameObject go = new GameObject("类名(只用于标识)");

// 切换场景时不销毁,全局有效

DontDestroyOnLoad(go);

_instance = Util.AddComponentForGameObject<类>(go);

}

return _instance;

}

不继承MonoBehavior的类

代码

public static 类 _instance;

private 类()

{

}

public 类 Instance()

{

if (_instance == null)

{

_instance = new 类();

}

return _instance;

}

观察者

  • 就是实现一个 EventListener

    • AddEvent
    • Dispatch
  • 当接收到某个协议的消息时,进行广播(Dispatch)

服务器端

  • 账号服务器

    • Http(WebAPI)
  • 游戏服务器
    • Socket编程,使用观察者模式
    • Socket包压缩与安全维护

客户端

Unity窗口插件开发

代码模式切换工具(通过宏定义)

代码

  • 脚本创建在 Editor目录下
  • 要出现菜单,需要添加MenuItem Attribute
  • 如果要弹出一个窗口,类需要继承 EditorWindow

定义宏的编辑器位置

  • 网上搜

AssetsBundle 批量导出到AssetsBundle

API

  • Application.dataPath: 编辑器模式下的项目地址
  • Application.persistentDataPath: 发布模式下的程序地址

UGUI

Canvas

模式

Screen Space - Overlay

不需要UI Camera,UI将永远在所有摄像机最前面

Screen Space - Camera(常用)

需要UI Camera

Screen Space - WorldSpace

Canvas 可以移动了(默认它的Rect Transform 组件继承自Transform 并且不可变)

自适应分辨率

  • Scale With Screen Size 可以自定义分辨率

层级管理

  • 给 Panel(可见的窗口)添加一个 Canvas 组件,勾选Override Sorting 设置 Order In Layer 序号

Rect Transform

  • Anchors: Min 和 Max 单位是 %

Image

设置为 Sliced 进行缩放,选择 sliced类型,锁定到原图,点击 sprite editor 进行编辑

RawImage

放大图 Texture

Text

NGUI 中的label

特效(阴影等)

  • 在需要添加特效的组件上添加 Shadow等组件

动图

  • 导入 DOTween 插件
  • DoTween 扩展了 transform 组件,使用transform组件.Doxxx实现
     
  1. 项目目录结构
  • Scenes/
  • UI/
  • Audio/
  • Materials/
  • Effects/
  • Resources/
    • UI/
    • Roles/
    • StreamingAssets/(初始资源)
    • Bundles/(项目资源更新)
      • version.txt
      • Models/
      • Editor/
        • Menu.cs

          • [MenuItem("Left God/Debug Window")]
          • public static void DebugWindow()
          • {
            • DebugWindow debugWindow = EditorWindow.GetWindow<DebugWindow>();
            • debugWindow.titleContent = new GUIContent("Debug Window");
            • debugWindow.Show();
            • }
            • DebugWindow.cs
              • extends EditorWindow
              • Scripts/
                • Test/
                • Protocols/
                  • 定义的一堆协议
                  • Core/
                    • EventCenter(观察者)

                      • extends Singleton
                      • Dispatch
                      • Singleton.cs
                        • public Singleton<T> where T : new()
                        • {
                          • private static T _sharedObject;
                          • public static T SharedObject()
                          • {
                            • if (_sharedObject == null)
                            • {
                              • _sharedObject = new T();
                              • }
                              • return _sharedObject;
                              • }
                              • }
                              • SingletonMono.cs
                                • public SingletonMono<T> where T : Compoent
                                • {
                                  • private static T _sharedObject;
                                  • public static T SharedObject()
                                  • {
                                    • if (_sharedObject == null)
                                    • {

GameObject gameObject = new GameObject(nameof(T));

DontDestroyOnLoad(gameObject);

_sharedObject = gameObject.GetOrCreateCompoent<T>();

  • }
  • return _sharedObject;
  • }
  • }
  • Network/
    • NetworkHttpClient.cs
    • NetworkSocketClient.cs
    • UI/
      • UISceneManager.cs
      • UIWindowManager.cs
      • UILayerManager.cs
      • UIViewBase.cs
      • UIViewSceneBase.cs
        • Container
        • UIViewWindowBase.cs
        • Views/
        • Controllers/
        • AssetBundle/
          • AssetBundleLoader.cs
          • AssetBundleLoaderAsync.cs
          • AssetBundleManager.cs
          • AssetBundleDownloader.cs
          • Camera/
            • CameraController.cs
            • EffectManager.cs
            • Role/
              • AI/

                • IRoleDoAI.cs
                • IMonsterDoAI.cs
                • IDoAI.cs
                • FSM/
                  • FSMManager.cs
                  • RoleStates
                    • RoleStateAbstract.cs

                      • OnEnter()
                      • OnUpdate()
                      • OnExit()
                      • RoleStateIdle.cs
                      • RoleStateHurt.cs
                      • RoleStateAttack.cs
                      • RoleStateDie.cs
                      • RoleStateRun.cs
                      • RoleController.cs
                      • RoleManager.cs
                      • Logger.cs
                        • Debug();
                        • ResourceManager.cs
                        • AudioManager.cs
                        • EnumDefs.cs
                        • ConstDefs.cs
                        • Global.cs
                        • BufferStream.cs
                          • extends MemoryStream
                          • ReadShort()
                          • WriteShort(value);
                          • ReadInt();
                          • WriteInt(value);
                          • ReadString();
                          • WriteString(value);
  • Extensions

    • GameObject.cs

      • GetOrCreateCompoent<T>()
      • Utils
        • StringUtil.cs
        • EncroptUtil.cs
  1. 插件
  • UGUI HUD 文字上弹
  • AStarPathfinding Project
  • LitJson

Unity 笔记的更多相关文章

  1. 【Unity笔记】打包安卓APK时Build Setting中的三种Build System

    Internal(Default):Unity内置,仅需Android SDK支持.不能导出工程,适用于仅适用Unity开发的工程. Gradle(New):使用Gradle进行构建,需要Androi ...

  2. 【Unity笔记】静态碰撞体的陷阱

    概念 静态碰撞体(Static Collider):物体勾选为静态Static,有Collider组件,无Rigidbody组件. 静态碰撞体的陷阱 Unity在游戏初始化时,会把所有的静态碰撞体合并 ...

  3. 【Unity笔记】Terrain地形制作坍塌/深坑

    Unity的Terrain组件在[set the terrain height]分页下,height高度为0时,可理解为该地形的海平面高度,此时就不能地形下榻.把height调到100,点击[flat ...

  4. Unity笔记 英保通 Unity新的动画系统Mecanim

    Mecanim动画系统是Unity独一无二.强大灵活的人物动画系统.该系统赋予您的人类和非人类人物令人难以置信的自然流畅的动作,使它们栩栩如生.游戏中角色设计提高到了新的层次,在处理人类动画角色中可以 ...

  5. 【Unity笔记】Awake()和Start()的区别

    Awake在MonoBehavior创建后就立刻调用,Start将在MonoBehavior创建后在该帧Update之前,在该Monobehavior.enabled == true的情况下执行. v ...

  6. 【Unity笔记】常用插件

    记录一些常见插件,随时补充. iTween动画插件 原理:插值法,给出初始值和终点值,自动算出中间值. DoTween Tween动画 Playmaker $45 Playmaker由第三方软件商Hu ...

  7. (转)Unity笔记之编辑器(UnityEditor)

    在使用unity3d的过程中,时常会需要从场景中寻找或者调用一个对象,而Unity就提供了一个贴心的功能——拖拽.用鼠标拖一下中比写堆代码直观的多吧!但是Unity提供的远远不止这一丢丢,下面我们来简 ...

  8. Unity笔记

    1.使某个对象上的脚本失效和生效: GameObject.Find("xxx").transform.GetComponent<xxx>().enabled = fal ...

  9. 【Unity笔记】使物体(船)漂浮在水面上——浮力

    在官方论坛看到一个关于怎么使物体漂浮在水面上的讨论:https://forum.unity3d.com/threads/floating-a-object-on-water.31671/ 水动力系统 ...

随机推荐

  1. CMDB04 /流程梳理、cmdb总结

    CMDB04 /流程梳理.cmdb总结 目录 CMDB04 /流程梳理.cmdb总结 1. 流程梳理 1.1 环境 1.2 远程连接服务器 1.3 向服务器上传文件 1.4 运维管理服务器 2. cm ...

  2. 开源利器分享:BitBar 坐看今天你的项目涨了多少 star

    今天开头我想叨叨几句,我个人最近的感受.在这个信息爆炸,互联网的时代里.我的周遭总是充斥者着各种让人能产生焦虑的信息, 我不知道有没有小伙伴和我一样,看到各种神通广大.游戏人生的大侠,低头看看自己当前 ...

  3. 字符编码-Unicode、Utf-8 笔记

    Unicode 将世界上所有的符号都纳入其中.每一个符号都给予一个独一无二的编码,那么乱码问题就会消失.这就是 Unicode,就像它的名字都表示的,这是一种所有符号的编码 UTF-8 UTF-8 就 ...

  4. 用CBrother脚本实现smtp协议发送一份邮件

    用CBrother脚本实现smtp协议发送一份邮件 之前用CBrother脚本写了一个拯救“小霸王服务器”的程序,公司人用着都挺好用,但是有时候谁重启了服务器其他人不知道,造成了多人多次重启,每个人都 ...

  5. web自动化测试实战之生成测试报告

    同志们,老铁们,继上篇文章 web自动化测试实战之批量执行测试用例 之后我们接着继续往下走,有人说我们运行了所有测试用例,控制台输入的结果,如果很多测试用例那也不能够清晰快速的知道多少用例通过率以及错 ...

  6. C++ 简单介绍线段树

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上k. 求出某区间每一个数的和. 输入格式 第一行包含两个整数n,m分别表示该数列数字的个数和操作的总个数. 第二行包含n个用 ...

  7. 云原生时代高性能Java框架—Quarkus(一)

    --- Quarkus&GraalVM介绍.创建并启动第一个项目 Quarkus系列博文 Quarkus&GraalVM介绍.创建并启动第一个项目 构建Quarkus本地镜像.容器化部 ...

  8. 【Redis学习专题】- Redis主从+哨兵集群部署

    集群版本: redis-4.0.14 集群节点: 节点角色 IP redis-master 10.100.8.21 redis-slave1 10.100.8.22 redis-slave2 10.1 ...

  9. collection集合常用功能

    java.util.Collection接口 是所有单列集合最顶层的接口,里面定义了所有单列集合的共性方法 1.public boolean add(E e)     添加元素 2.public bo ...

  10. FaaS 给前端带来了什么?

    一.Serverless 与 FaaS Serverless 是一种云计算理念,即无服务器计算(Serverless Computing): Serverless suggests that the ...