Advertisement
i287219

CM3D2CameraUtility.Plugin v2.0.1.2 改変

Nov 6th, 2015
925
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 21.80 KB | None | 0 0
  1. // CM3D2CameraUtility.Plugin v2.0.1.2 改変(非公式)
  2. // Original by k8PzhOFo0 (https://github.com/k8PzhOFo0/CM3D2CameraUtility.Plugin)
  3. using System;
  4. using System.Reflection;
  5. using System.Linq;
  6. using UnityEngine;
  7. using UnityInjector;
  8. using UnityInjector.Attributes;
  9.  
  10. namespace CM3D2CameraUtility
  11. {
  12.     [PluginFilter("CM3D2x64"),
  13.     PluginFilter("CM3D2x86"),
  14.     PluginFilter("CM3D2VRx64"),
  15.     PluginName("Camera Utility"),
  16.     PluginVersion("2.0.1.2")]
  17.     public class CameraUtility : PluginBase
  18.     {
  19.         //移動関係キー設定
  20.         private KeyCode bgLeftMoveKey = KeyCode.LeftArrow;
  21.         private KeyCode bgRightMoveKey = KeyCode.RightArrow;
  22.         private KeyCode bgForwardMoveKey = KeyCode.UpArrow;
  23.         private KeyCode bgBackMoveKey = KeyCode.DownArrow;
  24.         private KeyCode bgUpMoveKey = KeyCode.PageUp;
  25.         private KeyCode bgDownMoveKey = KeyCode.PageDown;
  26.         private KeyCode bgLeftRotateKey = KeyCode.Delete;
  27.         private KeyCode bgRightRotateKey = KeyCode.End;
  28.         private KeyCode bgLeftPitchKey = KeyCode.Insert;
  29.         private KeyCode bgRightPitchKey = KeyCode.Home;
  30.         private KeyCode bgInitializeKey = KeyCode.Backspace;
  31.  
  32.         //VR用移動関係キー設定
  33.         private KeyCode bgLeftMoveKeyVR = KeyCode.J;
  34.         private KeyCode bgRightMoveKeyVR = KeyCode.L;
  35.         private KeyCode bgForwardMoveKeyVR = KeyCode.I;
  36.         private KeyCode bgBackMoveKeyVR = KeyCode.K;
  37.         private KeyCode bgUpMoveKeyVR = KeyCode.Alpha0;
  38.         private KeyCode bgDownMoveKeyVR = KeyCode.P;
  39.         private KeyCode bgLeftRotateKeyVR = KeyCode.U;
  40.         private KeyCode bgRightRotateKeyVR = KeyCode.O;
  41.         private KeyCode bgLeftPitchKeyVR = KeyCode.Alpha8;
  42.         private KeyCode bgRightPitchKeyVR = KeyCode.Alpha9;
  43.         private KeyCode bgInitializeKeyVR = KeyCode.Backspace;
  44.  
  45.         //カメラ操作関係キー設定
  46.         private KeyCode cameraLeftPitchKey = KeyCode.Period;
  47.         private KeyCode cameraRightPitchKey = KeyCode.Backslash;
  48.         private KeyCode cameraPitchInitializeKey = KeyCode.Slash;
  49.         private KeyCode cameraFoVPlusKey = KeyCode.RightBracket;
  50.  
  51.         //Equalsになっているが日本語キーボードだとセミコロン
  52.         private KeyCode cameraFoVMinusKey = KeyCode.Equals;
  53.  
  54.         //Semicolonになっているが日本語キーボードだとコロン
  55.         private KeyCode cameraFoVInitializeKey = KeyCode.Semicolon;
  56.  
  57.         //こっち見てキー設定
  58.         private KeyCode eyetoCamToggleKey = KeyCode.G;
  59.         private KeyCode eyetoCamChangeKey = KeyCode.T;
  60.  
  61.         //夜伽UI消しキー設定
  62.         private KeyCode hideUIToggleKey = KeyCode.Tab;
  63.  
  64.         //FPSモード切替キー設定
  65.         private KeyCode cameraFPSModeToggleKey = KeyCode.F;
  66.  
  67.         private enum modKey
  68.         {
  69.             Shift,
  70.             Alt,
  71.             Ctrl
  72.         }
  73.  
  74.         private Maid maid;
  75.         private CameraMain mainCamera;
  76.         private Transform mainCameraTransform;
  77.         private Transform maidTransform;
  78.         private Transform bg;
  79.         private GameObject manHead;
  80.         private GameObject uiObject;
  81.  
  82.         private float defaultFOV = 35f;
  83.         private bool allowUpdate = false;
  84.         private bool occulusVR = false;
  85.         private bool fpsMode = false;
  86.         private bool eyetoCamToggle = false;
  87.  
  88.         private float cameraRotateSpeed = 1f;
  89.         private float cameraFOVChangeSpeed = 0.25f;
  90.         private float floorMoveSpeed = 0.05f;
  91.         private float maidRotateSpeed = 2f;
  92.         private float fpsModeFoV = 60f;
  93.  
  94.         private int sceneLevel;
  95.         private int frameCount = 0;
  96.  
  97.         private float fpsOffsetForward = 0.02f;
  98.         private float fpsOffsetUp = -0.06f;
  99.         private float fpsOffsetRight = 0f;
  100.  
  101.         ////以下の数値だと男の目の付近にカメラが移動しますが
  102.         ////うちのメイドはデフォで顔ではなく喉元見てるのであんまりこっち見てくれません
  103.         //private float fpsOffsetForward = 0.1f;
  104.         //private float fpsOffsetUp = 0.12f;
  105.  
  106.         private Vector3 oldPos;
  107.         private Vector3 oldTargetPos;
  108.         private float oldDistance;
  109.         private float oldFoV;
  110.         private Quaternion oldRotation;
  111.  
  112.         private bool oldEyetoCamToggle;
  113.         private int eyeToCamIndex = 0;
  114.  
  115.         private bool uiVisible = true;
  116.         private GameObject profilePanel;
  117.  
  118.         public void Awake()
  119.         {
  120.             GameObject.DontDestroyOnLoad(this);
  121.  
  122.             string path = Application.dataPath;
  123.             occulusVR = path.Contains("CM3D2VRx64");
  124.             if (occulusVR)
  125.             {
  126.                 bgLeftMoveKey = bgLeftMoveKeyVR;
  127.                 bgRightMoveKey = bgRightMoveKeyVR;
  128.                 bgForwardMoveKey = bgForwardMoveKeyVR;
  129.                 bgBackMoveKey = bgBackMoveKeyVR;
  130.                 bgUpMoveKey = bgUpMoveKeyVR;
  131.                 bgDownMoveKey = bgDownMoveKeyVR;
  132.                 bgLeftRotateKey = bgLeftRotateKeyVR;
  133.                 bgRightRotateKey = bgRightRotateKeyVR;
  134.                 bgLeftPitchKey = bgLeftPitchKeyVR;
  135.                 bgRightPitchKey = bgRightPitchKeyVR;
  136.                 bgInitializeKey = bgInitializeKeyVR;
  137.             }
  138.         }
  139.  
  140.         public void Start()
  141.         {
  142.             mainCameraTransform = Camera.main.gameObject.transform;
  143.         }
  144.  
  145.         public void OnLevelWasLoaded(int level)
  146.         {
  147.             sceneLevel = level;
  148.  
  149.             maid = GameMain.Instance.CharacterMgr.GetMaid(0);
  150.  
  151.             if (maid)
  152.             {
  153.                 maidTransform = maid.body0.transform;
  154.             }
  155.  
  156.             bg = GameObject.Find("__GameMain__/BG").transform;
  157.  
  158.             mainCamera = GameMain.Instance.MainCamera;
  159.  
  160.             if (maid && bg && maidTransform)
  161.             {
  162.                 allowUpdate = true;
  163.             }
  164.             else
  165.             {
  166.                 allowUpdate = false;
  167.             }
  168.  
  169.             if (occulusVR)
  170.             {
  171.                 uiObject = GameObject.Find("ovr_screen");
  172.             }
  173.             else
  174.             {
  175.                 uiObject = GameObject.Find("/UI Root/Camera");
  176.                 defaultFOV = Camera.main.fieldOfView;
  177.             }
  178.  
  179.             if (level == 5)
  180.             {
  181.                 GameObject uiRoot = GameObject.Find("/UI Root");
  182.                 profilePanel = uiRoot.transform.Find("ProfilePanel").gameObject;
  183.             }
  184.             else if (level == 12)
  185.             {
  186.                 GameObject uiRoot = GameObject.Find("/UI Root");
  187.                 profilePanel = uiRoot.transform.Find("UserEditPanel").gameObject;
  188.             }
  189.             fpsMode = false;
  190.         }
  191.  
  192.         private bool getModKeyPressing(modKey key)
  193.         {
  194.             switch (key)
  195.             {
  196.                 case modKey.Shift:
  197.                     return (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift));
  198.  
  199.                 case modKey.Alt:
  200.                     return (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt));
  201.  
  202.                 case modKey.Ctrl:
  203.                     return (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl));
  204.  
  205.                 default:
  206.                     return false;
  207.             }
  208.         }
  209.  
  210.         private void SaveCameraPos()
  211.         {
  212.             oldPos = mainCamera.GetPos();
  213.             oldTargetPos = mainCamera.GetTargetPos();
  214.             oldDistance = mainCamera.GetDistance();
  215.             oldRotation = mainCameraTransform.rotation;
  216.             oldFoV = Camera.main.fieldOfView;
  217.         }
  218.  
  219.         private void LoadCameraPos()
  220.         {
  221.             mainCameraTransform.rotation = oldRotation;
  222.             mainCamera.SetPos(oldPos);
  223.             mainCamera.SetTargetPos(oldTargetPos, true);
  224.             mainCamera.SetDistance(oldDistance, true);
  225.             Camera.main.fieldOfView = oldFoV;
  226.         }
  227.  
  228.         private Vector3 GetYotogiPlayPosition()
  229.         {
  230.             var field = mainCamera.GetType().GetField("m_vCenter", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
  231.             return (Vector3)field.GetValue(mainCamera);
  232.         }
  233.  
  234.         private void FirstPersonCamera()
  235.         {
  236.             if (sceneLevel == 14)
  237.             {
  238.                 if (!manHead)
  239.                 {
  240.                     if (frameCount == 60)
  241.                     {
  242.                         GameObject manExHead = GameObject.Find("__GameMain__/Character/Active/AllOffset/Man[0]");
  243.                         Transform[] manExHeadTransforms = manExHead ? manExHead.GetComponentsInChildren<Transform>() : new Transform[0];
  244.            
  245.                         Transform[] manHedas = manExHeadTransforms.Where(trans => trans.name.IndexOf("_SM_") > -1).ToArray();
  246.  
  247.                         foreach (Transform mh in manHedas)
  248.                         {
  249.                             GameObject smManHead = mh.gameObject;
  250.                             foreach (Transform smmh in smManHead.transform)
  251.                             {
  252.                                 if (smmh.name.IndexOf("ManHead") > -1)
  253.                                 {
  254.                                     manHead = smmh.gameObject;
  255.                                 }
  256.                             }
  257.                         }
  258.                         frameCount = 0;
  259.                     }
  260.                     else
  261.                     {
  262.                         frameCount++;
  263.                     }
  264.                 }
  265.                 else
  266.                 {
  267.                     if (occulusVR)
  268.                     {
  269.                         if (Input.GetKeyDown(cameraFPSModeToggleKey))
  270.                         {
  271.                             //    eyetoCamToggle = false;
  272.                             //    maid.EyeToCamera(Maid.EyeMoveType.無し, 0f);
  273.                             Vector3 localPos = uiObject.transform.localPosition;
  274.                             mainCamera.SetPos(manHead.transform.position);
  275.                             uiObject.transform.position = manHead.transform.position;
  276.                             uiObject.transform.localPosition = localPos;
  277.                         }
  278.                     }
  279.                     else
  280.                     {
  281.                         if (Input.GetKeyDown(cameraFPSModeToggleKey))
  282.                         {
  283.                             fpsMode = !fpsMode;
  284.                             Console.WriteLine("fpsmode = " + fpsMode.ToString());
  285.                             if (fpsMode)
  286.                             {
  287.                                 SaveCameraPos();
  288.  
  289.                                 Camera.main.fieldOfView = fpsModeFoV;
  290.                                 eyetoCamToggle = false;
  291.                                 maid.EyeToCamera(Maid.EyeMoveType.無し, 0f);
  292.  
  293.                                 mainCameraTransform.rotation = Quaternion.LookRotation(-manHead.transform.up);
  294.  
  295.                                 manHead.renderer.enabled = false;
  296.                             }
  297.                             else
  298.                             {
  299.                                 Vector3 cameraTargetPosFromScript = GetYotogiPlayPosition();
  300.  
  301.                                 if (oldTargetPos != cameraTargetPosFromScript)
  302.                                 {
  303.                                     Console.WriteLine("Position Changed!");
  304.                                     oldTargetPos = cameraTargetPosFromScript;
  305.                                 }
  306.                                 manHead.renderer.enabled = true;
  307.  
  308.                                 LoadCameraPos();
  309.                                 eyetoCamToggle = oldEyetoCamToggle;
  310.                                 oldEyetoCamToggle = eyetoCamToggle;
  311.                             }
  312.                         }
  313.                         if (fpsMode)
  314.                         {
  315.                             Vector3 cameraTargetPosFromScript = GetYotogiPlayPosition();
  316.                             if (oldTargetPos != cameraTargetPosFromScript)
  317.                             {
  318.                                 Console.WriteLine("Position Changed!");
  319.                                 mainCameraTransform.rotation = Quaternion.LookRotation(-manHead.transform.up);
  320.                                 oldTargetPos = cameraTargetPosFromScript;
  321.                             }
  322.  
  323.                             mainCamera.SetPos(manHead.transform.position + manHead.transform.up * fpsOffsetUp + manHead.transform.right * fpsOffsetRight + manHead.transform.forward * fpsOffsetForward);
  324.                             mainCamera.SetTargetPos(manHead.transform.position + manHead.transform.up * fpsOffsetUp + manHead.transform.right * fpsOffsetRight + manHead.transform.forward * fpsOffsetForward, true);
  325.                             mainCamera.SetDistance(0f, true);
  326.                         }
  327.                     }
  328.                 }
  329.             }
  330.         }
  331.  
  332.         private void ExtendedCameraHandle()
  333.         {
  334.             if (!occulusVR)
  335.             {
  336.                 if (mainCameraTransform)
  337.                 {
  338.                     if (Input.GetKey(cameraFoVMinusKey))
  339.                     {
  340.                         Camera.main.fieldOfView += -cameraFOVChangeSpeed;
  341.                     }
  342.                     if (Input.GetKey(cameraFoVInitializeKey))
  343.                     {
  344.                         Camera.main.fieldOfView = defaultFOV;
  345.                     }
  346.                     if (Input.GetKey(cameraFoVPlusKey))
  347.                     {
  348.                         Camera.main.fieldOfView += cameraFOVChangeSpeed;
  349.                     }
  350.                     if (Input.GetKey(cameraLeftPitchKey))
  351.                     {
  352.                         mainCameraTransform.Rotate(0, 0, cameraRotateSpeed);
  353.                     }
  354.                     if (Input.GetKey(cameraPitchInitializeKey))
  355.                     {
  356.                         mainCameraTransform.eulerAngles = new Vector3(
  357.                             mainCameraTransform.rotation.eulerAngles.x,
  358.                             mainCameraTransform.rotation.eulerAngles.y,
  359.                             0f);
  360.                     }
  361.                     if (Input.GetKey(cameraRightPitchKey))
  362.                     {
  363.                         mainCameraTransform.Rotate(0, 0, -cameraRotateSpeed);
  364.                     }
  365.                 }
  366.             }
  367.         }
  368.  
  369.         private void FloorMover(float moveSpeed, float rotateSpeed)
  370.         {
  371.             if (bg)
  372.             {
  373.                 Vector3 cameraForward = mainCameraTransform.TransformDirection(Vector3.forward);
  374.                 Vector3 cameraRight = mainCameraTransform.TransformDirection(Vector3.right);
  375.                 Vector3 cameraUp = mainCameraTransform.TransformDirection(Vector3.up);
  376.  
  377.                 Vector3 direction = Vector3.zero;
  378.  
  379.                 if (Input.GetKey(bgLeftMoveKey))
  380.                 {
  381.                     direction += new Vector3(cameraRight.x, 0f, cameraRight.z) * moveSpeed;
  382.                 }
  383.                 if (Input.GetKey(bgRightMoveKey))
  384.                 {
  385.                     direction += new Vector3(cameraRight.x, 0f, cameraRight.z) * -moveSpeed;
  386.                 }
  387.                 if (Input.GetKey(bgBackMoveKey))
  388.                 {
  389.                     direction += new Vector3(cameraForward.x, 0f, cameraForward.z) * moveSpeed;
  390.                 }
  391.                 if (Input.GetKey(bgForwardMoveKey))
  392.                 {
  393.                     direction += new Vector3(cameraForward.x, 0f, cameraForward.z) * -moveSpeed;
  394.                 }
  395.                 if (Input.GetKey(bgUpMoveKey))
  396.                 {
  397.                     direction += new Vector3(0f, cameraUp.y, 0f) * -moveSpeed;
  398.                 }
  399.                 if (Input.GetKey(bgDownMoveKey))
  400.                 {
  401.                     direction += new Vector3(0f, cameraUp.y, 0f) * moveSpeed;
  402.                 }
  403.  
  404.                 //bg.position += direction;
  405.                 bg.localPosition += direction;
  406.  
  407.                 if (Input.GetKey(bgLeftRotateKey))
  408.                 {
  409.                     bg.RotateAround(maidTransform.transform.position, Vector3.up, rotateSpeed);
  410.                 }
  411.                 if (Input.GetKey(bgRightRotateKey))
  412.                 {
  413.                     bg.RotateAround(maidTransform.transform.position, Vector3.up, -rotateSpeed);
  414.                 }
  415.                 if (Input.GetKey(bgLeftPitchKey))
  416.                 {
  417.                     bg.RotateAround(maidTransform.transform.position, new Vector3(cameraForward.x, 0f, cameraForward.z), rotateSpeed);
  418.                 }
  419.                 if (Input.GetKey(bgRightPitchKey))
  420.                 {
  421.                     bg.RotateAround(maidTransform.transform.position, new Vector3(cameraForward.x, 0f, cameraForward.z), -rotateSpeed);
  422.                 }
  423.  
  424.                 if (getModKeyPressing(modKey.Alt) && (Input.GetKey(bgLeftRotateKey) || Input.GetKey(bgRightRotateKey)))
  425.                 {
  426.                     bg.RotateAround(maidTransform.position, Vector3.up, -bg.rotation.eulerAngles.y);
  427.                 }
  428.                 if (getModKeyPressing(modKey.Alt) && (Input.GetKey(bgLeftPitchKey) || Input.GetKey(bgRightPitchKey)))
  429.                 {
  430.                     bg.RotateAround(maidTransform.position, Vector3.forward, -bg.rotation.eulerAngles.z);
  431.                     bg.RotateAround(maidTransform.position, Vector3.right, -bg.rotation.eulerAngles.x);
  432.                 }
  433.                 if (getModKeyPressing(modKey.Alt) && (Input.GetKey(bgLeftMoveKey) || Input.GetKey(bgRightMoveKey) || Input.GetKey(bgBackMoveKey) || Input.GetKey(bgForwardMoveKey)))
  434.                 {
  435.                     bg.localPosition = new Vector3(0f, bg.localPosition.y, 0f);
  436.                 }
  437.                 if (getModKeyPressing(modKey.Alt) && (Input.GetKey(bgUpMoveKey) || Input.GetKey(bgDownMoveKey)))
  438.                 {
  439.                     bg.localPosition = new Vector3(bg.localPosition.x, 0f, bg.localPosition.z);
  440.                 }
  441.                 if (Input.GetKeyDown(bgInitializeKey))
  442.                 {
  443.                     bg.localPosition = Vector3.zero;
  444.                     bg.RotateAround(maidTransform.position, Vector3.up, -bg.rotation.eulerAngles.y);
  445.                     bg.RotateAround(maidTransform.position, Vector3.right, -bg.rotation.eulerAngles.x);
  446.                     bg.RotateAround(maidTransform.position, Vector3.forward, -bg.rotation.eulerAngles.z);
  447.                     bg.RotateAround(maidTransform.position, Vector3.up, -bg.rotation.eulerAngles.y);
  448.                 }
  449.             }
  450.         }
  451.  
  452.         private void LookAtThis()
  453.         {
  454.             if (Input.GetKeyDown(eyetoCamChangeKey))
  455.             {
  456.                 if (eyeToCamIndex == Enum.GetNames(typeof(Maid.EyeMoveType)).Length - 1)
  457.                 {
  458.                     eyetoCamToggle = false;
  459.                     eyeToCamIndex = 0;
  460.                 }
  461.                 else
  462.                 {
  463.                     eyeToCamIndex++;
  464.                     eyetoCamToggle = true;
  465.                 }
  466.                 maid.EyeToCamera((Maid.EyeMoveType)eyeToCamIndex, 0f);
  467.                 Console.WriteLine("EyeToCam:{0}", eyeToCamIndex);
  468.             }
  469.  
  470.             if (Input.GetKeyDown(eyetoCamToggleKey))
  471.             {
  472.                 eyetoCamToggle = !eyetoCamToggle;
  473.                 //Console.WriteLine("Eye to Cam : {0}", eyetoCamToggle);
  474.                 if (!eyetoCamToggle)
  475.                 {
  476.                     maid.EyeToCamera(Maid.EyeMoveType.無し, 0f);
  477.                     eyeToCamIndex = 0;
  478.                     Console.WriteLine("EyeToCam:{0}", eyeToCamIndex);
  479.                 }
  480.                 else
  481.                 {
  482.                     maid.EyeToCamera(Maid.EyeMoveType.目と顔を向ける, 0f);
  483.                     eyeToCamIndex = 5;
  484.                     Console.WriteLine("EyeToCam:{0}", eyeToCamIndex);
  485.                 }
  486.             }
  487.         }
  488.  
  489.         private void HideUI()
  490.         {
  491.             if (Input.GetKeyDown(hideUIToggleKey))
  492.             {
  493.                 if (sceneLevel == 5 || sceneLevel == 14)
  494.                 {
  495.                     var field = GameMain.Instance.MainCamera.GetType().GetField("m_eFadeState", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
  496.  
  497.                     int i = (int)field.GetValue(mainCamera);
  498.                     //Console.WriteLine("FadeState:{0}", i);
  499.                     if (i == 0)
  500.                     {
  501.                         uiVisible = !uiVisible;
  502.                         if (uiObject)
  503.                         {
  504.                             uiObject.SetActive(uiVisible);
  505.                         }
  506.                     }
  507.                     Console.WriteLine("UIVisible:{0}", uiVisible);
  508.                 }
  509.             }
  510.         }
  511.  
  512.         public void Update()
  513.         {
  514.             if (sceneLevel == 5)
  515.             {
  516.                 if (profilePanel.activeSelf)
  517.                 {
  518.                     allowUpdate = false;
  519.                 }
  520.                 else
  521.                 {
  522.                     allowUpdate = true;
  523.                 }
  524.             }
  525.             else if (sceneLevel == 12)
  526.             {
  527.                 if (profilePanel.activeSelf)
  528.                 {
  529.                     allowUpdate = false;
  530.                 }
  531.                 else
  532.                 {
  533.                     allowUpdate = true;
  534.                 }
  535.             }
  536.  
  537.             if (allowUpdate)
  538.             {
  539.                 float moveSpeed = floorMoveSpeed;
  540.                 float rotateSpeed = maidRotateSpeed;
  541.  
  542.                 if (getModKeyPressing(modKey.Shift))
  543.                 {
  544.                     moveSpeed *= 0.1f;
  545.                     rotateSpeed *= 0.1f;
  546.                 }
  547.  
  548.                 FirstPersonCamera();
  549.  
  550.                 LookAtThis();
  551.  
  552.                 FloorMover(moveSpeed, rotateSpeed);
  553.  
  554.                 if (!occulusVR)
  555.                 {
  556.                     ExtendedCameraHandle();
  557.  
  558.                     HideUI();
  559.                 }
  560.             }
  561.         }
  562.     }
  563. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement