• Unity 笔记


    摄像机

    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
  • 相关阅读:
    挺好的 "简历修改"
    请问谁会破解QQ空间相册的密码呀教我下谢谢!!。
    SEO工具,站长必备
    解决vs2005自带水晶报表次数的限制的次数
    虚拟主机如何实现泛域名解析?
    读出数据库里面的数据,来 绑定列表框 DropDownList1
    取出数据里面相同的记录
    如何让文本框输入字母自动换行???? 很有意思的哦 
    net事件丢失解决方法
    暑假集训每日一题0727 (网络流)
  • 原文地址:https://www.cnblogs.com/megachen/p/12310846.html
Copyright © 2020-2023  润新知