Advertisement
Guest User

CM3D2CameraUtility.Plugin v2.3.4.0_20170110

a guest
Jan 9th, 2017
515
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 43.76 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Reflection;
  6. using System.Linq;
  7. using UnityEngine;
  8. using UnityInjector;
  9. using UnityInjector.Attributes;
  10.  
  11. namespace CM3D2.CameraUtility.Plugin
  12. {
  13.     [PluginFilter("CM3D2x64"),
  14.     PluginFilter("CM3D2x86"),
  15.     PluginFilter("CM3D2VRx64"),
  16.     PluginFilter("CM3D2OHx64"),
  17.     PluginFilter("CM3D2OHx86"),
  18.     PluginFilter("CM3D2OHVRx64"),
  19.     PluginName("Camera Utility"),
  20.     PluginVersion("2.3.4.0")]
  21.     public class CameraUtility : PluginBase
  22.     {
  23.         #region Constants
  24.  
  25.         /// <summary>CM3D2のシーンリスト</summary>
  26.         private enum Scene
  27.         {
  28.             /// <summary>メイド選択(夜伽、品評会の前など)</summary>
  29.             SceneCharacterSelect = 1,
  30.  
  31.             /// <summary>品評会</summary>
  32.             SceneCompetitiveShow = 2,
  33.  
  34.             /// <summary>昼夜メニュー、仕事結果</summary>
  35.             SceneDaily = 3,
  36.  
  37.             /// <summary>ダンス1(ドキドキ Fallin' Love)</summary>
  38.             SceneDance_DDFL = 4,
  39.  
  40.             /// <summary>メイドエディット</summary>
  41.             SceneEdit = 5,
  42.  
  43.             /// <summary>メーカーロゴ</summary>
  44.             SceneLogo = 6,
  45.  
  46.             /// <summary>メイド管理</summary>
  47.             SceneMaidManagement = 7,
  48.  
  49.             /// <summary>ショップ</summary>
  50.             SceneShop = 8,
  51.  
  52.             /// <summary>タイトル画面</summary>
  53.             SceneTitle = 9,
  54.  
  55.             /// <summary>トロフィー閲覧</summary>
  56.             SceneTrophy = 10,
  57.  
  58.             /// <summary>Chu-B Lip 夜伽</summary>
  59.             SceneYotogi_ChuB = 10,
  60.  
  61.             /// <summary>???</summary>
  62.             SceneTryInfo = 11,
  63.  
  64.             /// <summary>主人公エディット</summary>
  65.             SceneUserEdit = 12,
  66.  
  67.             /// <summary>起動時警告画面</summary>
  68.             SceneWarning = 13,
  69.  
  70.             /// <summary>夜伽</summary>
  71.             SceneYotogi = 14,
  72.  
  73.             /// <summary>ADVパート(kgスクリプト処理)</summary>
  74.             SceneADV = 15,
  75.  
  76.             /// <summary>日付画面</summary>
  77.             SceneStartDaily = 16,
  78.  
  79.             /// <summary>タイトルに戻る</summary>
  80.             SceneToTitle = 17,
  81.  
  82.             /// <summary>MVP</summary>
  83.             SceneSingleEffect = 18,
  84.  
  85.             /// <summary>スタッフロール</summary>
  86.             SceneStaffRoll = 19,
  87.  
  88.             /// <summary>ダンス2(Entrance To You)</summary>
  89.             SceneDance_ETY = 20,
  90.  
  91.             /// <summary>ダンス3(Scarlet Leap)</summary>
  92.             SceneDance_SL = 22,
  93.  
  94.             /// <summary>回想モード</summary>
  95.             SceneRecollection = 24,
  96.  
  97.             /// <summary>撮影モード</summary>
  98.             ScenePhotoMode = 27,
  99.         }
  100.  
  101.         /// <summary>FPS モードを有効化するシーンリスト</summary>
  102.         private static int[] EnableFpsScenes = {
  103.             (int)Scene.SceneYotogi,
  104.             (int)Scene.SceneADV,
  105.             (int)Scene.SceneRecollection,
  106.         };
  107.  
  108.         /// <summary>Chu-B Lip で FPS モードを有効化するシーンリスト</summary>
  109.         private static int[] EnableFpsScenesChuB = {
  110.             (int)Scene.SceneYotogi_ChuB,
  111.         };
  112.  
  113.         /// <summary>Hide UI モードを有効化するシーンリスト</summary>
  114.         private static int[] EnableHideUIScenes = {
  115.             (int)Scene.SceneEdit,
  116.             (int)Scene.SceneYotogi,
  117.             (int)Scene.SceneADV,
  118.             (int)Scene.SceneRecollection,
  119.             (int)Scene.ScenePhotoMode,
  120.         };
  121.  
  122.         /// <summary>Chu-B Lip で Hide UI モードを有効化するシーンリスト</summary>
  123.         private static int[] EnableHideUIScenesChuB = {
  124.             (int)Scene.SceneYotogi_ChuB,
  125.         };
  126.  
  127.         /// <summary>モディファイアキー</summary>
  128.         private enum ModifierKey
  129.         {
  130.             None = 0,
  131.             Shift,
  132.             Alt,
  133.             Ctrl
  134.         }
  135.  
  136.         /// <summary>状態変化チェック間隔</summary>
  137.         private const float stateCheckInterval = 1f;
  138.  
  139.         #endregion
  140.         #region Configuration
  141.  
  142.         /// <summary>CM3D2.CameraUtility.Plugin 設定ファイル</summary>
  143.         class CameraUtilityConfig : BaseConfig<CameraUtilityConfig>
  144.         {
  145.  
  146.             [Description("通常キー設定")]
  147.             public class KeyConfig
  148.             {
  149.                 //移動関係キー設定
  150.                 [Description("背景(メイド) 左移動")]
  151.                 public KeyCode bgLeftMove = KeyCode.LeftArrow;
  152.                 [Description("背景(メイド) 右移動")]
  153.                 public KeyCode bgRightMove = KeyCode.RightArrow;
  154.                 [Description("背景 前移動")]
  155.                 public KeyCode bgForwardMove = KeyCode.UpArrow;
  156.                 [Description("背景 後移動")]
  157.                 public KeyCode bgBackMove = KeyCode.DownArrow;
  158.                 [Description("背景 上移動")]
  159.                 public KeyCode bgUpMove = KeyCode.PageUp;
  160.                 [Description("背景 下移動")]
  161.                 public KeyCode bgDownMove = KeyCode.PageDown;
  162.                 [Description("背景(メイド) 左回転")]
  163.                 public KeyCode bgLeftRotate = KeyCode.Delete;
  164.                 [Description("背景(メイド) 右回転")]
  165.                 public KeyCode bgRightRotate = KeyCode.End;
  166.                 [Description("背景 左ロール")]
  167.                 public KeyCode bgLeftRoll = KeyCode.Insert;
  168.                 [Description("背景 右ロール")]
  169.                 public KeyCode bgRightRoll = KeyCode.Home;
  170.                 [Description("背景 初期化")]
  171.                 public KeyCode bgInitialize = KeyCode.Backspace;
  172.  
  173.                 //カメラ操作関係キー設定
  174.                 [Description("カメラ 左ロール")]
  175.                 public KeyCode cameraLeftRoll = KeyCode.Period;
  176.                 [Description("カメラ 右ロール")]
  177.                 public KeyCode cameraRightRoll = KeyCode.Backslash;
  178.                 [Description("カメラ 水平")]
  179.                 public KeyCode cameraRollInitialize = KeyCode.Slash;
  180.                 [Description("カメラ 視野拡大")]
  181.                 public KeyCode cameraFoVPlus = KeyCode.RightBracket;
  182.                 [Description("カメラ 視野縮小 (初期値 Equals は日本語キーボードでは [; + れ])")]
  183.                 public KeyCode cameraFoVMinus = KeyCode.Equals;
  184.                 [Description("カメラ 視野初期化 (初期値 Semicolon は日本語キーボードでは [: * け])")]
  185.                 public KeyCode cameraFoVInitialize = KeyCode.Semicolon;
  186.  
  187.                 //こっち見てキー設定
  188.                 [Description("こっち見て/通常切り替え (トグル)")]
  189.                 public KeyCode eyetoCamToggle = KeyCode.G;
  190.                 [Description("視線及び顔の向き切り替え (ループ)")]
  191.                 public KeyCode eyetoCamChange = KeyCode.T;
  192.  
  193.                 //UI表示トグルキー設定
  194.                 [Description("操作パネル表示切り替え (トグル)")]
  195.                 public KeyCode hideUIToggle = KeyCode.Tab;
  196.  
  197.                 //FPSモード切替キー設定
  198.                 [Description("夜伽時一人称視点切り替え")]
  199.                 public KeyCode cameraFPSModeToggle = KeyCode.F;
  200.  
  201.                 //男切替キー設定
  202.                 [Description("FPSの対象とする男切り替え(ループ)")]
  203.                 public KeyCode manHeadChange = KeyCode.R;
  204.  
  205.                 //モディファイアキー設定
  206.                 [Description("低速移動モード (押下中は移動速度が減少)\n設定値: Shift, Alt, Ctrl")]
  207.                 public ModifierKey speedDownModifier = ModifierKey.Shift;
  208.                 [Description("初期化モード (押下中に移動キーを押すと対象の軸が初期化)\n設定値: Shift, Alt, Ctrl")]
  209.                 public ModifierKey initializeModifier = ModifierKey.Alt;
  210.             }
  211.  
  212.             [Description("VRモード用キー設定")]
  213.             public class OVRKeyConfig : KeyConfig
  214.             {
  215.                 public OVRKeyConfig()
  216.                 {
  217.                     //移動関係キー設定
  218.                     bgLeftMove = KeyCode.J;
  219.                     bgRightMove = KeyCode.L;
  220.                     bgForwardMove = KeyCode.I;
  221.                     bgBackMove = KeyCode.K;
  222.                     bgUpMove = KeyCode.Alpha0;
  223.                     bgDownMove = KeyCode.P;
  224.                     bgLeftRotate = KeyCode.U;
  225.                     bgRightRotate = KeyCode.O;
  226.                     bgLeftRoll = KeyCode.Alpha8;
  227.                     bgRightRoll = KeyCode.Alpha9;
  228.                     bgInitialize = KeyCode.Backspace;
  229.                 }
  230.             }
  231.  
  232.             [Description("カメラ設定")]
  233.             public class CameraConfig
  234.             {
  235.                 [Description("背景 移動速度")]
  236.                 public float bgMoveSpeed = 3f;
  237.                 [Description("背景(メイド) 回転速度")]
  238.                 public float bgRotateSpeed = 120f;
  239.                 [Description("カメラ 回転速度")]
  240.                 public float cameraRotateSpeed = 60f;
  241.                 [Description("視野 変更速度")]
  242.                 public float cameraFoVChangeSpeed = 15f;
  243.                 [Description("低速移動モード倍率")]
  244.                 public float speedMagnification = 0.1f;
  245.  
  246.                 [Description("FPSモード 視野")]
  247.                 public float fpsModeFoV = 60f;
  248.                 [Description("FPSモード カメラ位置調整 前後\n"
  249.                            + "(カメラ位置を男の目の付近にするには、以下の数値を設定する)\n"
  250.                            + "(メイドが男の喉あたりを見ているため視線が合わない場合がある)\n"
  251.                            + "  fpsOffsetForward = 0.1\n"
  252.                            + "  fpsOffsetUp = 0.12")]
  253.                 public float fpsOffsetForward = 0.02f;
  254.                 [Description("FPSモード カメラ位置調整 上下")]
  255.                 public float fpsOffsetUp = -0.06f;
  256.                 [Description("FPSモード カメラ位置調整 左右")]
  257.                 public float fpsOffsetRight = 0f;
  258.  
  259.                 // 20170110
  260.                 [Description("FPSモード カメラ移動速度 上下左右")]
  261.                 public float fpsCameraSpeed = 0.001f;
  262.                 [Description("FPSモード カメラ移動速度 前後")]
  263.                 public float fpsCameraScrollSpeed = 0.02f;
  264.             }
  265.  
  266.             [Description("CM3D2.CameraUtility.Plugin 設定ファイル\n\n"
  267.                        + "カメラ設定")]
  268.             public CameraConfig Camera = new CameraConfig();
  269.             [Description("通常キー設定\n"
  270.                        + "設定値: http://docs.unity3d.com/ja/current/ScriptReference/KeyCode.html を参照")]
  271.             public KeyConfig Keys = new KeyConfig();
  272.             [Description("VRモード用キー設定")]
  273.             public OVRKeyConfig OVRKeys = new OVRKeyConfig();
  274.         }
  275.  
  276.         #endregion
  277.         #region Variables
  278.  
  279.         //設定
  280.         private CameraUtilityConfig config;
  281.  
  282.         //オブジェクト
  283.         private Maid maid;
  284.         private CameraMain mainCamera;
  285.         private Transform mainCameraTransform;
  286.         private Transform maidTransform;
  287.         private Transform bg;
  288.         private GameObject manHead;
  289.         private GameObject uiObject;
  290.         private GameObject profilePanel;
  291.  
  292.         //状態フラグ
  293.         private bool isOVR = false;
  294.         private bool isChuBLip = false;
  295.         private bool fpsMode = false;
  296.         private bool fpsShakeCorrection = false;
  297.         private bool eyetoCamToggle = false;
  298.         private int eyeToCamIndex = 0;
  299.         private bool uiVisible = true;
  300.         private int targetManNumber = 0;
  301.         private int sceneLevel;
  302.  
  303.         //状態退避変数
  304.         private float defaultFoV = 35f;
  305.         private Vector3 oldCameraPos;
  306.         private Vector3 oldTargetPos;
  307.         private float oldDistance;
  308.         private float oldFoV;
  309.         private Quaternion oldRotation;
  310.         private int oldEyeToCamIndex;
  311.         private Vector3 lastCameraPos = Vector3.zero;
  312.  
  313.         // 20170110
  314.         private float checkLookAtThisWaitTime = 0.2f;   // こっち見て モーション変更確認間隔
  315.         private Vector3 oldMousePos;
  316.         private Vector3 fpsCameraOffset = Vector3.zero;
  317.         private Vector3 oldFpsCameraOffset = Vector3.zero;
  318.  
  319.         //コルーチン一覧
  320.         private LinkedList<Coroutine> mainCoroutines = new LinkedList<Coroutine>();
  321.  
  322.         #endregion
  323.         #region Override Methods
  324.  
  325.         public void Awake()
  326.         {
  327.             GameObject.DontDestroyOnLoad(this);
  328.  
  329.             string path = Application.dataPath;
  330.             isChuBLip = path.Contains("CM3D2OH");
  331.             isOVR = path.Contains("VRx64");
  332.  
  333.             config = CameraUtilityConfig.FromPreferences(Preferences);
  334.             config.SavePreferences();
  335.             SaveConfig();
  336.         }
  337.  
  338.         public void Start()
  339.         {
  340.             mainCameraTransform = Camera.main.gameObject.transform;
  341.         }
  342.  
  343.         public void OnLevelWasLoaded(int level)
  344.         {
  345.             sceneLevel = level;
  346.             Log("OnLevelWasLoaded: {0}", sceneLevel);
  347.             StopMainCoroutines();
  348.             config.LoadPreferences();
  349.             if (InitializeSceneObjects())
  350.             {
  351.                 StartMainCoroutines();
  352.             }
  353.             VisibleAllManHead();
  354.         }
  355.  
  356.         #endregion
  357.         #region Properties
  358.  
  359.         private CameraUtilityConfig.KeyConfig Keys
  360.         {
  361.             get
  362.             {
  363.                 return isOVR ? config.OVRKeys : config.Keys;
  364.             }
  365.         }
  366.  
  367.         private bool AllowUpdate
  368.         {
  369.             get
  370.             {
  371.                 // 文字入力パネルがアクティブの場合 false
  372.                 return profilePanel == null || !profilePanel.activeSelf;
  373.             }
  374.         }
  375.  
  376.         #endregion
  377.         #region Private Methods
  378.  
  379.         #region Methods for Main
  380.  
  381.         private bool InitializeSceneObjects()
  382.         {
  383.             maid = GameMain.Instance.CharacterMgr.GetMaid(0);
  384.             maidTransform = maid ? maid.body0.transform : null;
  385.             bg = GameObject.Find("__GameMain__/BG").transform;
  386.             mainCamera = GameMain.Instance.MainCamera;
  387.             manHead = null;
  388.  
  389.             if (isOVR)
  390.             {
  391.                 uiObject = GameObject.Find("ovr_screen");
  392.             }
  393.             else
  394.             {
  395.                 uiObject = GameObject.Find("/UI Root/Camera");
  396.                 if (uiObject == null)
  397.                 {
  398.                     uiObject = GameObject.Find("SystemUI Root/Camera");
  399.                 }
  400.                 defaultFoV = Camera.main.fieldOfView;
  401.             }
  402.  
  403.             if (sceneLevel == (int)Scene.SceneEdit)
  404.             {
  405.                 GameObject uiRoot = GameObject.Find("/UI Root");
  406.                 profilePanel = uiRoot.transform.Find("ProfilePanel").gameObject;
  407.             }
  408.             else if (sceneLevel == (int)Scene.SceneUserEdit)
  409.             {
  410.                 GameObject uiRoot = GameObject.Find("/UI Root");
  411.                 profilePanel = uiRoot.transform.Find("UserEditPanel").gameObject;
  412.             }
  413.             else
  414.             {
  415.                 profilePanel = null;
  416.             }
  417.  
  418.             lastCameraPos = Vector3.zero;
  419.             fpsShakeCorrection = false;
  420.             fpsMode = false;
  421.  
  422.             return maid && maidTransform && bg && mainCamera;
  423.         }
  424.  
  425.         private void StartMainCoroutines()
  426.         {
  427.             // Start FirstPersonCamera
  428.             if ((isChuBLip && EnableFpsScenesChuB.Contains(sceneLevel)) || EnableFpsScenes.Contains(sceneLevel))
  429.             {
  430.                 if (isOVR)
  431.                 {
  432.                     mainCoroutines.AddLast(StartCoroutine(OVRFirstPersonCameraCoroutine()));
  433.                 }
  434.                 else
  435.                 {
  436.                     mainCoroutines.AddLast(StartCoroutine(FirstPersonCameraCoroutine()));
  437.                 }
  438.             }
  439.  
  440.             // Start LookAtThis
  441.             mainCoroutines.AddLast(StartCoroutine(LookAtThisCoroutine()));
  442.             // 20170110
  443.             mainCoroutines.AddLast(StartCoroutine(CheckLookAtThisCoroutine()));
  444.  
  445.             // Start FloorMover
  446.             mainCoroutines.AddLast(StartCoroutine(FloorMoverCoroutine()));
  447.  
  448.             // Start ExtendedCameraHandle
  449.             if (!isOVR)
  450.             {
  451.                 mainCoroutines.AddLast(StartCoroutine(ExtendedCameraHandleCoroutine()));
  452.             }
  453.  
  454.             // Start HideUI
  455.             if ((isChuBLip && EnableHideUIScenesChuB.Contains(sceneLevel)) || EnableHideUIScenes.Contains(sceneLevel))
  456.             {
  457.                 if (!isOVR)
  458.                 {
  459.                     mainCoroutines.AddLast(StartCoroutine(HideUICoroutine()));
  460.                 }
  461.             }
  462.         }
  463.  
  464.         private void StopMainCoroutines()
  465.         {
  466.             foreach (var coroutine in mainCoroutines)
  467.             {
  468.                 StopCoroutine(coroutine);
  469.             }
  470.             mainCoroutines.Clear();
  471.         }
  472.  
  473.         #endregion
  474.  
  475.         #region Methods for Misc
  476.  
  477.         private void Log(string format, params object[] args)
  478.         {
  479.             Debug.Log(Name + ": " + string.Format(format, args));
  480.         }
  481.  
  482.         private bool IsModKeyPressing(ModifierKey key)
  483.         {
  484.             switch (key)
  485.             {
  486.                 case ModifierKey.Shift:
  487.                     return (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift));
  488.  
  489.                 case ModifierKey.Alt:
  490.                     return (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt));
  491.  
  492.                 case ModifierKey.Ctrl:
  493.                     return (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl));
  494.  
  495.                 default:
  496.                     return false;
  497.             }
  498.         }
  499.  
  500.         private void SaveCameraPos()
  501.         {
  502.             Assert.IsNotNull(mainCamera);
  503.             Assert.IsNotNull(mainCameraTransform);
  504.  
  505.             oldCameraPos = mainCamera.GetPos();
  506.             oldTargetPos = mainCamera.GetTargetPos();
  507.             oldDistance = mainCamera.GetDistance();
  508.             oldRotation = mainCameraTransform.rotation;
  509.             oldFoV = Camera.main.fieldOfView;
  510.         }
  511.  
  512.         private void LoadCameraPos()
  513.         {
  514.             Assert.IsNotNull(mainCamera);
  515.             Assert.IsNotNull(mainCameraTransform);
  516.  
  517.             mainCameraTransform.rotation = oldRotation;
  518.             mainCamera.SetPos(oldCameraPos);
  519.             mainCamera.SetTargetPos(oldTargetPos, true);
  520.             mainCamera.SetDistance(oldDistance, true);
  521.             Camera.main.fieldOfView = oldFoV;
  522.         }
  523.  
  524.         private Vector3 GetYotogiPlayPosition()
  525.         {
  526.             Assert.IsNotNull(mainCamera);
  527.             var field = mainCamera.GetType().GetField("m_vCenter", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
  528.             return (Vector3)field.GetValue(mainCamera);
  529.         }
  530.  
  531.         private int GetFadeState()
  532.         {
  533.             Assert.IsNotNull(mainCamera);
  534.             var field = mainCamera.GetType().GetField("m_eFadeState", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
  535.             return (int)field.GetValue(mainCamera);
  536.         }
  537.  
  538.         private GameObject FindByNameInChildren(GameObject parent, string name)
  539.         {
  540.             Assert.IsNotNull(parent);
  541.             Assert.IsNotNull(name);
  542.             foreach (Transform transform in parent.transform)
  543.             {
  544.                 if (transform.name.IndexOf(name) > -1)
  545.                 {
  546.                     return transform.gameObject;
  547.                 }
  548.             }
  549.             return null;
  550.         }
  551.  
  552.         private void SetRendererEnabled(GameObject obj, bool enabled)
  553.         {
  554.             Assert.IsNotNull(obj);
  555.             var renderer = obj.GetComponent<Renderer>();
  556.             if (renderer)
  557.             {
  558.                 renderer.enabled = enabled;
  559.             }
  560.         }
  561.  
  562.         #endregion
  563.  
  564.         #region Methods for FirstPersonCamera
  565.  
  566.         private void OVRToggleFirstPersonCameraMode()
  567.         {
  568.             if (uiObject && manHead)
  569.             {
  570.                 fpsMode = true;
  571.                 //SetEyeToCamToggle(false);
  572.                 Vector3 localPos = uiObject.transform.localPosition;
  573.                 mainCamera.SetPos(manHead.transform.position);
  574.                 uiObject.transform.position = manHead.transform.position;
  575.                 uiObject.transform.localPosition = localPos;
  576.                 SetRendererEnabled(manHead, false);
  577.             }
  578.         }
  579.  
  580.         private void ToggleFirstPersonCameraMode()
  581.         {
  582.             if (fpsShakeCorrection)
  583.             {
  584.                 fpsShakeCorrection = false;
  585.                 SetFirstPersonCameraMode(false);
  586.             }
  587.             else if (fpsMode)
  588.             {
  589.                 fpsShakeCorrection = true;
  590.             }
  591.             else
  592.             {
  593.                 SetFirstPersonCameraMode(true);
  594.             }
  595.             Log("FpsMode = {0}, ShakeCorrection = {1}", fpsMode, fpsShakeCorrection);
  596.         }
  597.  
  598.         private void SetFirstPersonCameraMode(bool enable)
  599.         {
  600.             if (fpsMode == enable) return;
  601.  
  602.             Assert.IsNotNull(maid);
  603.             Assert.IsNotNull(manHead);
  604.             Assert.IsNotNull(mainCameraTransform);
  605.  
  606.             fpsMode = enable;
  607.             if (fpsMode)
  608.             {
  609.                 // save status
  610.                 SaveCameraPos();
  611.                 lastCameraPos = oldCameraPos;
  612.                 Camera.main.fieldOfView = config.Camera.fpsModeFoV;
  613.                 oldEyeToCamIndex = eyeToCamIndex;
  614.                 // reset EyeToCam
  615.                 SetEyeToCamToggle(false);
  616.                 // setup camera
  617.                 mainCameraTransform.rotation = Quaternion.LookRotation(-manHead.transform.up);
  618.                 // hide ManHead
  619.                 SetRendererEnabled(manHead, false);
  620.  
  621.                 // 20170110
  622.                 fpsCameraOffset = Vector3.zero;
  623.             }
  624.             else
  625.             {
  626.                 UpdateFirstPersonCamera();
  627.                 LoadCameraPos();
  628.                 SetEyeToCamIndex(oldEyeToCamIndex);
  629.                 SetRendererEnabled(manHead, true);
  630.             }
  631.         }
  632.  
  633.         private void UpdateFirstPersonCamera()
  634.         {
  635.             Assert.IsNotNull(manHead);
  636.             Assert.IsNotNull(mainCamera);
  637.             Assert.IsNotNull(mainCameraTransform);
  638.  
  639.             Vector3 cameraTargetPosFromScript = GetYotogiPlayPosition();
  640.             if (oldTargetPos != cameraTargetPosFromScript)
  641.             {
  642.                 Log("Position Changed!");
  643.                 mainCameraTransform.rotation = Quaternion.LookRotation(-manHead.transform.up);
  644.                 oldTargetPos = cameraTargetPosFromScript;
  645.             }
  646.  
  647.             // 20170110
  648.             // 一人称視点でもカメラ移動
  649.             bool animFlg = true;
  650.  
  651.             float scroll = Input.GetAxis("Mouse ScrollWheel");
  652.             if (scroll != 0) {
  653.                 animFlg = false;
  654.                 scroll = scroll > 0 ? 1 : -1;
  655.                 Transform trans = mainCameraTransform;
  656.                 fpsCameraOffset += trans.forward * (scroll * config.Camera.fpsCameraScrollSpeed);
  657.             }
  658.  
  659.             if (Input.GetMouseButtonDown(2)) {
  660.                 oldMousePos = Input.mousePosition;
  661.                 oldFpsCameraOffset = fpsCameraOffset;
  662.             }
  663.             else if (Input.GetMouseButton(2)) {
  664.                 animFlg = false;
  665.                 Vector3 diff = Input.mousePosition - oldMousePos;
  666.                 if (!(diff.magnitude < Vector3.kEpsilon)) {
  667.                     diff = -diff * config.Camera.fpsCameraSpeed;
  668.                     Transform trans = mainCameraTransform;
  669.                     fpsCameraOffset = oldFpsCameraOffset + (trans.right * diff.x) + (trans.up * diff.y);
  670.                 }
  671.  
  672.                 // 同時押しで初期化
  673.                 if (Input.GetMouseButton(1)) {
  674.                     fpsCameraOffset = Vector3.zero;
  675.                 }
  676.             }
  677.  
  678.             Vector3 cameraPos = manHead.transform.position
  679.                 + manHead.transform.up * config.Camera.fpsOffsetUp
  680.                 + manHead.transform.right * config.Camera.fpsOffsetRight
  681.                 + manHead.transform.forward * config.Camera.fpsOffsetForward;
  682.  
  683.             cameraPos += fpsCameraOffset;
  684.             if (fpsShakeCorrection && animFlg)
  685.             {
  686.                 cameraPos = Vector3.Lerp(cameraPos, lastCameraPos, 0.9f);
  687.             }
  688.             lastCameraPos = cameraPos;
  689.             mainCamera.SetPos(cameraPos);
  690.             mainCamera.SetTargetPos(cameraPos, animFlg);
  691.             mainCamera.SetDistance(0f, true);
  692.         }
  693.  
  694.         #endregion
  695.  
  696.         #region Methods for ManHead
  697.  
  698.         private void FindAndChangeManHead(int manNumber)
  699.         {
  700.             var manCount = GetVisibleManCount();
  701.             if (manNumber < 0 || manCount <= manNumber) return;
  702.  
  703.             var newManHead = FindManHead(manNumber);
  704.             if (newManHead)
  705.             {
  706.                 ChangeManHead(newManHead);
  707.             }
  708.         }
  709.  
  710.         private void ChangeManHead(GameObject newManHead)
  711.         {
  712.             Assert.IsNotNull(mainCameraTransform);
  713.             Assert.IsNotNull(newManHead);
  714.  
  715.             if (fpsMode)
  716.             {
  717.                 if (manHead)
  718.                 {
  719.                     SetRendererEnabled(manHead, true);
  720.                 }
  721.  
  722.                 manHead = newManHead;
  723.                 mainCameraTransform.rotation = Quaternion.LookRotation(-manHead.transform.up);
  724.                 SetRendererEnabled(manHead, false);
  725.             }
  726.             else
  727.             {
  728.                 manHead = newManHead;
  729.             }
  730.         }
  731.  
  732.         private GameObject FindManHead(int manNumber)
  733.         {
  734.             var man = GameMain.Instance.CharacterMgr.GetMan(manNumber);
  735.             if (!man || !man.body0 || !man.body0.trsHead) return null;
  736.             var head = man.body0.trsHead.gameObject;
  737.             if (!head) return null;
  738.             var mhead = FindByNameInChildren(head, "mhead");
  739.             if (!mhead) return null;
  740.             return FindByNameInChildren(mhead, "ManHead");
  741.         }
  742.  
  743.         private int GetVisibleManCount()
  744.         {
  745.             var characterMgr = GameMain.Instance.CharacterMgr;
  746.             var manCount = characterMgr.GetManCount();
  747.             for (int number = 0; number < manCount; number++)
  748.             {
  749.                 var man = characterMgr.GetMan(number);
  750.                 if (!man.Visible) return number;
  751.             }
  752.             return manCount;
  753.         }
  754.  
  755.         private void VisibleAllManHead()
  756.         {
  757.             var manCount = GameMain.Instance.CharacterMgr.GetManCount();
  758.             for (int number = 0; number < manCount; number++)
  759.             {
  760.                 var head = FindManHead(number);
  761.                 if (head != null)
  762.                 {
  763.                     SetRendererEnabled(head, true);
  764.                 }
  765.             }
  766.         }
  767.  
  768.         private void IncreseTargetManNumber()
  769.         {
  770.             targetManNumber = targetManNumber + 1;
  771.             var visibleManCount = GetVisibleManCount();
  772.             if (visibleManCount <= targetManNumber)
  773.             {
  774.                 targetManNumber = 0;
  775.             }
  776.             Log("Change ManHeadNumber: " + targetManNumber);
  777.         }
  778.  
  779.         private bool IsIllegalTargetMan()
  780.         {
  781.             var visibleManCount = GetVisibleManCount();
  782.             if (visibleManCount == 0) return false;
  783.             return visibleManCount <= targetManNumber;
  784.         }
  785.  
  786.         #endregion
  787.  
  788.         #region Methods for ExtendedCameraHandle
  789.  
  790.         private void UpdateCameraFoV()
  791.         {
  792.             if (Input.GetKey(Keys.cameraFoVInitialize))
  793.             {
  794.                 Camera.main.fieldOfView = defaultFoV;
  795.                 return;
  796.             }
  797.  
  798.             float fovChangeSpeed = config.Camera.cameraFoVChangeSpeed * Time.deltaTime;
  799.             if (IsModKeyPressing(Keys.speedDownModifier))
  800.             {
  801.                 fovChangeSpeed *= config.Camera.speedMagnification;
  802.             }
  803.  
  804.             if (Input.GetKey(Keys.cameraFoVMinus))
  805.             {
  806.                 Camera.main.fieldOfView += -fovChangeSpeed;
  807.             }
  808.             if (Input.GetKey(Keys.cameraFoVPlus))
  809.             {
  810.                 Camera.main.fieldOfView += fovChangeSpeed;
  811.             }
  812.         }
  813.  
  814.         private void UpdateCameraRotation()
  815.         {
  816.             Assert.IsNotNull(mainCameraTransform);
  817.  
  818.             if (Input.GetKey(Keys.cameraRollInitialize))
  819.             {
  820.                 mainCameraTransform.eulerAngles = new Vector3(
  821.                         mainCameraTransform.rotation.eulerAngles.x,
  822.                         mainCameraTransform.rotation.eulerAngles.y,
  823.                         0f);
  824.                 return;
  825.             }
  826.  
  827.             float rotateSpeed = config.Camera.cameraRotateSpeed * Time.deltaTime;
  828.             if (IsModKeyPressing(Keys.speedDownModifier))
  829.             {
  830.                 rotateSpeed *= config.Camera.speedMagnification;
  831.             }
  832.  
  833.             if (Input.GetKey(Keys.cameraLeftRoll))
  834.             {
  835.                 mainCameraTransform.Rotate(0, 0, rotateSpeed);
  836.             }
  837.             if (Input.GetKey(Keys.cameraRightRoll))
  838.             {
  839.                 mainCameraTransform.Rotate(0, 0, -rotateSpeed);
  840.             }
  841.         }
  842.  
  843.         #endregion
  844.  
  845.         #region Methods for FloorMover
  846.  
  847.         private void UpdateBackgroudPosition()
  848.         {
  849.             Assert.IsNotNull(bg);
  850.  
  851.             if (Input.GetKeyDown(Keys.bgInitialize))
  852.             {
  853.                 bg.localPosition = Vector3.zero;
  854.                 bg.RotateAround(maidTransform.position, Vector3.up, -bg.rotation.eulerAngles.y);
  855.                 bg.RotateAround(maidTransform.position, Vector3.right, -bg.rotation.eulerAngles.x);
  856.                 bg.RotateAround(maidTransform.position, Vector3.forward, -bg.rotation.eulerAngles.z);
  857.                 bg.RotateAround(maidTransform.position, Vector3.up, -bg.rotation.eulerAngles.y);
  858.                 return;
  859.             }
  860.  
  861.             if (IsModKeyPressing(Keys.initializeModifier))
  862.             {
  863.                 if (Input.GetKey(Keys.bgLeftRotate) || Input.GetKey(Keys.bgRightRotate))
  864.                 {
  865.                     bg.RotateAround(maidTransform.position, Vector3.up, -bg.rotation.eulerAngles.y);
  866.                 }
  867.                 if (Input.GetKey(Keys.bgLeftRoll) || Input.GetKey(Keys.bgRightRoll))
  868.                 {
  869.                     bg.RotateAround(maidTransform.position, Vector3.forward, -bg.rotation.eulerAngles.z);
  870.                     bg.RotateAround(maidTransform.position, Vector3.right, -bg.rotation.eulerAngles.x);
  871.                 }
  872.                 if (Input.GetKey(Keys.bgLeftMove) || Input.GetKey(Keys.bgRightMove) || Input.GetKey(Keys.bgBackMove) || Input.GetKey(Keys.bgForwardMove))
  873.                 {
  874.                     bg.localPosition = new Vector3(0f, bg.localPosition.y, 0f);
  875.                 }
  876.                 if (Input.GetKey(Keys.bgUpMove) || Input.GetKey(Keys.bgDownMove))
  877.                 {
  878.                     bg.localPosition = new Vector3(bg.localPosition.x, 0f, bg.localPosition.z);
  879.                 }
  880.                 return;
  881.             }
  882.  
  883.             Vector3 cameraForward = mainCameraTransform.TransformDirection(Vector3.forward);
  884.             Vector3 cameraRight = mainCameraTransform.TransformDirection(Vector3.right);
  885.             Vector3 cameraUp = mainCameraTransform.TransformDirection(Vector3.up);
  886.             Vector3 direction = Vector3.zero;
  887.  
  888.             float moveSpeed = config.Camera.bgMoveSpeed * Time.deltaTime;
  889.             float rotateSpeed = config.Camera.bgRotateSpeed * Time.deltaTime;
  890.             if (IsModKeyPressing(Keys.speedDownModifier))
  891.             {
  892.                 moveSpeed *= config.Camera.speedMagnification;
  893.                 rotateSpeed *= config.Camera.speedMagnification;
  894.             }
  895.  
  896.             if (Input.GetKey(Keys.bgLeftMove))
  897.             {
  898.                 direction += new Vector3(cameraRight.x, 0f, cameraRight.z) * moveSpeed;
  899.             }
  900.             if (Input.GetKey(Keys.bgRightMove))
  901.             {
  902.                 direction += new Vector3(cameraRight.x, 0f, cameraRight.z) * -moveSpeed;
  903.             }
  904.             if (Input.GetKey(Keys.bgBackMove))
  905.             {
  906.                 direction += new Vector3(cameraForward.x, 0f, cameraForward.z) * moveSpeed;
  907.             }
  908.             if (Input.GetKey(Keys.bgForwardMove))
  909.             {
  910.                 direction += new Vector3(cameraForward.x, 0f, cameraForward.z) * -moveSpeed;
  911.             }
  912.             if (Input.GetKey(Keys.bgUpMove))
  913.             {
  914.                 direction += new Vector3(0f, cameraUp.y, 0f) * -moveSpeed; }
  915.             if (Input.GetKey(Keys.bgDownMove))
  916.             {
  917.                 direction += new Vector3(0f, cameraUp.y, 0f) * moveSpeed;
  918.             }
  919.  
  920.             //bg.position += direction;
  921.             bg.localPosition += direction;
  922.  
  923.             if (Input.GetKey(Keys.bgLeftRotate))
  924.             {
  925.                 bg.RotateAround(maidTransform.transform.position, Vector3.up, rotateSpeed);
  926.             }
  927.             if (Input.GetKey(Keys.bgRightRotate))
  928.             {
  929.                 bg.RotateAround(maidTransform.transform.position, Vector3.up, -rotateSpeed);
  930.             }
  931.             if (Input.GetKey(Keys.bgLeftRoll))
  932.             {
  933.                 bg.RotateAround(maidTransform.transform.position, new Vector3(cameraForward.x, 0f, cameraForward.z), rotateSpeed);
  934.             }
  935.             if (Input.GetKey(Keys.bgRightRoll))
  936.             {
  937.                 bg.RotateAround(maidTransform.transform.position, new Vector3(cameraForward.x, 0f, cameraForward.z), -rotateSpeed);
  938.             }
  939.         }
  940.  
  941.         #endregion
  942.  
  943.         #region Methods for EyeToCam
  944.  
  945.         private void SetEyeToCamIndex(int index)
  946.         {
  947.             Assert.IsNotNull(maid);
  948.  
  949.             var eyeMoveTypes = (Maid.EyeMoveType[])Enum.GetValues(typeof(Maid.EyeMoveType));
  950.             eyeToCamIndex = index % eyeMoveTypes.Length;
  951.             if (eyeToCamIndex < 0)
  952.             {
  953.                 eyeToCamIndex += eyeMoveTypes.Length;
  954.             }
  955.             var eyeMoveType = eyeMoveTypes[eyeToCamIndex];
  956.             maid.EyeToCamera(eyeMoveType, 0f);
  957.             eyetoCamToggle = (eyeMoveType != Maid.EyeMoveType.無し);
  958.             Log("EyeToCam = {0}, EyeMoveType = [{1}]{2}", eyetoCamToggle, eyeToCamIndex, eyeMoveType);
  959.         }
  960.  
  961.         private void SetEyeToCamToggle(bool enable)
  962.         {
  963.             Assert.IsNotNull(maid);
  964.  
  965.             eyetoCamToggle = enable;
  966.             var eyeMoveType = (eyetoCamToggle) ? Maid.EyeMoveType.目と顔を向ける : Maid.EyeMoveType.無し;
  967.             maid.EyeToCamera(eyeMoveType, 0f);
  968.             var eyeMoveTypes = (Maid.EyeMoveType[])Enum.GetValues(typeof(Maid.EyeMoveType));
  969.             eyeToCamIndex = Array.IndexOf(eyeMoveTypes, eyeMoveType);
  970.             Log("EyeToCam = {0}, EyeMoveType = [{1}]{2}", eyetoCamToggle, eyeToCamIndex, eyeMoveType);
  971.         }
  972.  
  973.         #endregion
  974.  
  975.         #region Methods for HideUI
  976.  
  977.         private void ToggleUIVisible()
  978.         {
  979.             uiVisible = !uiVisible;
  980.             if (uiObject)
  981.             {
  982.                 uiObject.SetActive(uiVisible);
  983.                 Log("UIVisible:{0}", uiVisible);
  984.             }
  985.         }
  986.  
  987.         #endregion
  988.  
  989.         #endregion
  990.         #region Coroutines
  991.  
  992.         private IEnumerator OVRFirstPersonCameraCoroutine()
  993.         {
  994.             while (!manHead)
  995.             {
  996.                 FindAndChangeManHead(targetManNumber);
  997.                 yield return new WaitForSeconds(stateCheckInterval);
  998.             }
  999.             while (true)
  1000.             {
  1001.                 while (!AllowUpdate)
  1002.                 {
  1003.                     yield return new WaitForSeconds(stateCheckInterval);
  1004.                 }
  1005.                 if (Input.GetKeyDown(Keys.cameraFPSModeToggle))
  1006.                 {
  1007.                     OVRToggleFirstPersonCameraMode();
  1008.                 }
  1009.                 if (Input.GetKeyDown(Keys.manHeadChange) || IsIllegalTargetMan())
  1010.                 {
  1011.                     IncreseTargetManNumber();
  1012.                     FindAndChangeManHead(targetManNumber);
  1013.                     OVRToggleFirstPersonCameraMode();
  1014.                 }
  1015.                 yield return null;
  1016.             }
  1017.         }
  1018.  
  1019.         private IEnumerator FirstPersonCameraCoroutine()
  1020.         {
  1021.             while (!manHead)
  1022.             {
  1023.                 FindAndChangeManHead(targetManNumber);
  1024.                 yield return new WaitForSeconds(stateCheckInterval);
  1025.             }
  1026.             while (true)
  1027.             {
  1028.                 while (!AllowUpdate)
  1029.                 {
  1030.                     yield return new WaitForSeconds(stateCheckInterval);
  1031.                 }
  1032.                 if (Input.GetKeyDown(Keys.cameraFPSModeToggle))
  1033.                 {
  1034.                     ToggleFirstPersonCameraMode();
  1035.                 }
  1036.                 if (Input.GetKeyDown(Keys.manHeadChange) || IsIllegalTargetMan())
  1037.                 {
  1038.                     IncreseTargetManNumber();
  1039.                      FindAndChangeManHead(targetManNumber);
  1040.                 }
  1041.                 if (fpsMode)
  1042.                 {
  1043.                     UpdateFirstPersonCamera();
  1044.                 }
  1045.                 yield return null;
  1046.             }
  1047.         }
  1048.  
  1049.         private IEnumerator FloorMoverCoroutine()
  1050.         {
  1051.             while (true)
  1052.             {
  1053.                 UpdateBackgroudPosition();
  1054.                 yield return null;
  1055.             }
  1056.         }
  1057.  
  1058.         private IEnumerator ExtendedCameraHandleCoroutine()
  1059.         {
  1060.             while (true)
  1061.             {
  1062.                 UpdateCameraFoV();
  1063.                 UpdateCameraRotation();
  1064.                 yield return null;
  1065.             }
  1066.         }
  1067.  
  1068.         private IEnumerator LookAtThisCoroutine()
  1069.         {
  1070.             while (true)
  1071.             {
  1072.                 if (Input.GetKeyDown(Keys.eyetoCamChange))
  1073.                 {
  1074.                     SetEyeToCamIndex(eyeToCamIndex + 1);
  1075.                 }
  1076.                 if (Input.GetKeyDown(Keys.eyetoCamToggle))
  1077.                 {
  1078.                     SetEyeToCamToggle(!eyetoCamToggle);
  1079.                 }
  1080.                 yield return null;
  1081.             }
  1082.         }
  1083.  
  1084.         // 20170110
  1085.         private IEnumerator CheckLookAtThisCoroutine()
  1086.         {
  1087.             while (true)
  1088.             {
  1089.                 if (eyeToCamIndex != 0)
  1090.                     maid.EyeToCamera((Maid.EyeMoveType)eyeToCamIndex, 0f);
  1091.  
  1092.                 yield return new WaitForSeconds(checkLookAtThisWaitTime);
  1093.             }
  1094.         }
  1095.  
  1096.         private IEnumerator HideUICoroutine()
  1097.         {
  1098.             while (true)
  1099.             {
  1100.                 if (Input.GetKeyDown(Keys.hideUIToggle))
  1101.                 {
  1102.                     if (GetFadeState() == 0)
  1103.                     {
  1104.                         ToggleUIVisible();
  1105.                     }
  1106.                 }
  1107.                 yield return null;
  1108.             }
  1109.         }
  1110.  
  1111.         #endregion
  1112.     }
  1113.  
  1114.     #region Helper Classes
  1115.  
  1116.     public abstract class BaseConfig<TConfig> where TConfig: BaseConfig<TConfig>
  1117.     {
  1118.         private ExIni.IniFile Preferences;
  1119.  
  1120.         public static TConfig FromPreferences(ExIni.IniFile prefs)
  1121.         {
  1122.             TConfig config = (TConfig)Activator.CreateInstance(typeof(TConfig));
  1123.             config.Preferences = prefs;
  1124.             config.LoadPreferences();
  1125.             return config;
  1126.         }
  1127.  
  1128.         public void LoadPreferences()
  1129.         {
  1130.             foreach (var field in typeof(TConfig).GetFields())
  1131.             {
  1132.                 var sectionName = field.Name;
  1133.                 var sectionType = field.FieldType;
  1134.                 var getSectionMethod = typeof(TConfig)
  1135.                     .GetMethod("GetSection", new Type[] {typeof(string)})
  1136.                     .MakeGenericMethod(sectionType);
  1137.                 var section = getSectionMethod.Invoke(this, new object[] {sectionName});
  1138.                 field.SetValue(this, section);
  1139.             }
  1140.         }
  1141.  
  1142.         public void SavePreferences()
  1143.         {
  1144.             foreach (var field in typeof(TConfig).GetFields())
  1145.             {
  1146.                 var sectionName = field.Name;
  1147.                 var sectionType = field.FieldType;
  1148.                 var setSectionMethod = typeof(TConfig).GetMethod("SetSection").MakeGenericMethod(sectionType);
  1149.                 var config = field.GetValue(this);
  1150.                 setSectionMethod.Invoke(this, new object[] {sectionName, config});
  1151.                 UpdateComment(field, Preferences[sectionName].Comments);
  1152.             }
  1153.             UpdateComment(typeof(TConfig), Preferences.Comments);
  1154.         }
  1155.  
  1156.         public T GetSection<T>(string sectionName)
  1157.         {
  1158.             T config = (T)Activator.CreateInstance(typeof(T));
  1159.             return GetSection(sectionName, config);
  1160.         }
  1161.  
  1162.         public T GetSection<T>(string sectionName, T config)
  1163.         {
  1164.             Assert.IsNotNull(sectionName);
  1165.             Assert.IsNotNull(config);
  1166.             var section = Preferences.GetSection(sectionName);
  1167.             if (section != null)
  1168.             {
  1169.                 foreach (var field in typeof(T).GetFields())
  1170.                 {
  1171.                     string keyName = field.Name;
  1172.                     var key = section.GetKey(keyName);
  1173.                     if (key != null)
  1174.                     {
  1175.                         try
  1176.                         {
  1177.                             var converter = TypeDescriptor.GetConverter(field.FieldType);
  1178.                             var value = converter.ConvertFromString(key.RawValue);
  1179.                             field.SetValue(config, value);
  1180.                         }
  1181.                         catch
  1182.                         {
  1183.                             Debug.LogWarning(string.Format("{0}: Config read error: [{1}]{2}", GetType().Name, sectionName, keyName));
  1184.                         }
  1185.                     }
  1186.                 }
  1187.             }
  1188.             return config;
  1189.         }
  1190.  
  1191.         public void SetSection<T>(string sectionName, T config)
  1192.         {
  1193.             Assert.IsNotNull(sectionName);
  1194.             Assert.IsNotNull(config);
  1195.             var section = Preferences[sectionName];
  1196.             foreach (var field in typeof(T).GetFields())
  1197.             {
  1198.                 string keyName = field.Name;
  1199.                 var key = section[keyName];
  1200.                 var value = field.GetValue(config);
  1201.                 var converter = TypeDescriptor.GetConverter(field.FieldType);
  1202.                 key.Value = converter.ConvertToString(value);
  1203.                 UpdateComment(field, key.Comments);
  1204.             }
  1205.             UpdateComment(typeof(T), section.Comments);
  1206.         }
  1207.  
  1208.         private static void UpdateComment(MemberInfo info, ExIni.IniComment comment)
  1209.         {
  1210.             var desc = (DescriptionAttribute)info.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
  1211.             if (desc != null && !string.IsNullOrEmpty(desc.Description))
  1212.             {
  1213.                 var lines = desc.Description.Split(new string[] {"\n"}, StringSplitOptions.None);
  1214.                 comment.Comments = new List<string>(lines);
  1215.             }
  1216.         }
  1217.     }
  1218.  
  1219.     public static class Assert
  1220.     {
  1221.         [System.Diagnostics.Conditional("DEBUG")]
  1222.         public static void IsNotNull(object obj)
  1223.         {
  1224.             if (obj == null)
  1225.             {
  1226.                 string msg = "Assertion failed. Value is null.";
  1227.                 UnityEngine.Debug.LogError(msg);
  1228.             }
  1229.         }
  1230.     }
  1231.  
  1232.     #endregion
  1233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement