Guest User

CM3D2CameraUtility.Plugin

a guest
Aug 16th, 2015
924
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 17.17 KB | None | 0 0
  1. using System;
  2. using System.Reflection;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  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.0.0")]
  17.  
  18.     public class CameraUtility : PluginBase
  19.     {
  20.         private Maid maid;
  21.         private CameraMain mainCamera;
  22.         private Transform mainCameraTransform;
  23.         private Transform maidTransform;
  24.         private Transform bg;
  25.         private GameObject manEye;
  26.         private GameObject uiObject;
  27.  
  28.         private float defaultFOV = 35f;
  29.         private bool allowUpdate = false;
  30.         private bool occulusVR = false;
  31.         private bool fpsMode = false;
  32.         private bool eyetoCamToggle = false;
  33.  
  34.         private float cameraRotateSpeed = 1f;
  35.         private float cameraFOVChangeSpeed = 0.25f;
  36.         private float floorMoveSpeed = 0.05f;
  37.         private float maidRotateSpeed = 2f;
  38.         private float fpsModeFoV = 60f;
  39.  
  40.         private int sceneLevel;
  41.         private int frameCount = 0;
  42.  
  43.         private float fpsOffsetForward = 0.02f;
  44.         private float fpsOffsetUp = 0.06f;
  45.  
  46.         ////以下の数値だと男の目の付近にカメラが移動しますが
  47.         ////うちのメイドはデフォで顔ではなく喉元見てるのであんまりこっち見てくれません
  48.         //private float fpsOffsetForward = 0.1f;
  49.         //private float fpsOffsetUp = 0.12f;
  50.  
  51.         private KeyCode bgLeftMove = KeyCode.LeftArrow;
  52.         private KeyCode bgRightMove = KeyCode.RightArrow;
  53.         private KeyCode bgForwardMove = KeyCode.UpArrow;
  54.         private KeyCode bgBackMove = KeyCode.DownArrow;
  55.         private KeyCode bgUpMove = KeyCode.PageUp;
  56.         private KeyCode bgDownMove = KeyCode.PageDown;
  57.         private KeyCode bgLeftRotate = KeyCode.Delete;
  58.         private KeyCode bgRightRotate = KeyCode.End;
  59.         private KeyCode bgLeftPitch = KeyCode.Insert;
  60.         private KeyCode bgRightPitch = KeyCode.Home;
  61.  
  62.         private Vector3 oldPos;
  63.         private Vector3 oldTargetPos;
  64.         private float oldDistance;
  65.         private float oldFoV;
  66.         private Quaternion oldRotation;
  67.         private bool oldEyetoCamToggle;
  68.         private int eyeToCamIndex = 0;
  69.  
  70.         private bool uiVisible = true;
  71.  
  72.         private GameObject profilePanel;
  73.  
  74.         public void Awake()
  75.         {
  76.             GameObject.DontDestroyOnLoad(this);
  77.  
  78.             string path = Application.dataPath;
  79.             occulusVR = path.Contains("CM3D2VRx64");
  80.             if (occulusVR)
  81.             {
  82.                 bgLeftMove = KeyCode.J;
  83.                 bgRightMove = KeyCode.L;
  84.                 bgForwardMove = KeyCode.I;
  85.                 bgBackMove = KeyCode.K;
  86.                 bgUpMove = KeyCode.Alpha0;
  87.                 bgDownMove = KeyCode.P;
  88.                 bgLeftRotate = KeyCode.U;
  89.                 bgRightRotate = KeyCode.O;
  90.                 bgLeftPitch = KeyCode.Alpha8;
  91.                 bgRightPitch = KeyCode.Alpha9;
  92.             }
  93.         }
  94.  
  95.         public void Start()
  96.         {
  97.             mainCameraTransform = Camera.main.gameObject.transform;
  98.         }
  99.  
  100.         public void OnLevelWasLoaded(int level)
  101.         {
  102.             sceneLevel = level;
  103.  
  104.             maid = GameMain.Instance.CharacterMgr.GetMaid(0);
  105.  
  106.             if (maid)
  107.             {
  108.                 maidTransform = maid.body0.transform;
  109.             }
  110.  
  111.             bg = GameObject.Find("__GameMain__/BG").transform;
  112.  
  113.             mainCamera = GameMain.Instance.MainCamera;
  114.  
  115.             if (maid && bg && maidTransform)
  116.             {
  117.                 allowUpdate = true;
  118.             }
  119.             else
  120.             {
  121.                 allowUpdate = false;
  122.             }
  123.  
  124.             if (occulusVR)
  125.             {
  126.                 uiObject = GameObject.Find("ovr_screen");
  127.             }
  128.             else
  129.             {
  130.                 uiObject = GameObject.Find("/UI Root/Camera");
  131.                 defaultFOV = Camera.main.fieldOfView;
  132.             }
  133.  
  134.             if (level == 5)
  135.             {
  136.                 GameObject uiRoot = GameObject.Find("/UI Root");
  137.                 profilePanel = uiRoot.transform.Find("ProfilePanel").gameObject;
  138.             }
  139.             else if (level == 12)
  140.             {
  141.                 GameObject uiRoot = GameObject.Find("/UI Root");
  142.                 profilePanel = uiRoot.transform.Find("UserEditPanel").gameObject;
  143.             }
  144.             fpsMode = false;
  145.         }
  146.  
  147.         private void SaveCameraPos()
  148.         {
  149.             oldPos = mainCamera.GetPos();
  150.             oldTargetPos = mainCamera.GetTargetPos();
  151.             oldDistance = mainCamera.GetDistance();
  152.             oldRotation = mainCameraTransform.rotation;
  153.             oldFoV = Camera.main.fieldOfView;
  154.         }
  155.  
  156.         private void LoadCameraPos()
  157.         {
  158.             mainCameraTransform.rotation = oldRotation;
  159.             mainCamera.SetPos(oldPos);
  160.             mainCamera.SetTargetPos(oldTargetPos, true);
  161.             mainCamera.SetDistance(oldDistance, true);
  162.             Camera.main.fieldOfView = oldFoV;
  163.         }
  164.  
  165.         private Vector3 GetYotogiPlayPosition()
  166.         {
  167.             var field = mainCamera.GetType().GetField("m_vCenter", BindingFlags.GetField | BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance);
  168.             return (Vector3)field.GetValue(mainCamera);
  169.         }
  170.  
  171.         private void FirstPersonCamera()
  172.         {
  173.             if (sceneLevel == 14)
  174.             {
  175.                 if (!manEye)
  176.                 {
  177.                     if (frameCount == 60)
  178.                     {
  179.                         manEye = GameObject.Find("__GameMain__/Character/Active/AllOffset/Man[0]/Offset/_BO_mbody/_SM_mbody/ManBip/ManBip Spine/ManBip Spine1/ManBip Spine2/ManBip Neck/ManBip Head");
  180.                         frameCount = 0;
  181.                     }
  182.                     else
  183.                     {
  184.                         frameCount++;
  185.                     }
  186.                 }
  187.                 else
  188.                 {
  189.                     if (occulusVR)
  190.                     {
  191.                         if (Input.GetKeyDown(KeyCode.F))
  192.                         {
  193.                             Vector3 localPos = uiObject.transform.localPosition;
  194.                             mainCamera.SetPos(manEye.transform.position);
  195.                             uiObject.transform.position = manEye.transform.position;
  196.                             uiObject.transform.localPosition = localPos;
  197.  
  198.                         }
  199.                     }
  200.                     else
  201.                     {
  202.                         if (Input.GetKeyDown(KeyCode.F))
  203.                         {
  204.                             fpsMode = !fpsMode;
  205.                             Console.WriteLine("fpsmode = " + fpsMode.ToString());
  206.                             if (fpsMode)
  207.                             {
  208.                                 SaveCameraPos();
  209.  
  210.                                 Camera.main.fieldOfView = fpsModeFoV;
  211.                                 eyetoCamToggle = false;
  212.                                 maid.EyeToCamera(Maid.EyeMoveType.無し, 0f);
  213.  
  214.                                 mainCameraTransform.rotation = Quaternion.LookRotation(manEye.transform.up);
  215.                             }
  216.                             else
  217.                             {
  218.                                 Vector3 cameraTargetPosFromScript = GetYotogiPlayPosition();
  219.  
  220.                                 if (oldTargetPos != cameraTargetPosFromScript)
  221.                                 {
  222.                                     Console.WriteLine("Position Changed!");
  223.                                     oldTargetPos = cameraTargetPosFromScript;
  224.                                 }
  225.  
  226.                                 LoadCameraPos();
  227.                                 //Camera.main.fieldOfView = defaultFOV;
  228.  
  229.                                 //mainCamera.ResetFromScriptOnTarget();
  230.                                 eyetoCamToggle = oldEyetoCamToggle;
  231.                                 oldEyetoCamToggle = eyetoCamToggle;
  232.                             }
  233.                         }
  234.                         if (fpsMode)
  235.                         {
  236.                             Vector3 cameraTargetPosFromScript = GetYotogiPlayPosition();
  237.                             if (oldTargetPos != cameraTargetPosFromScript)
  238.                             {
  239.                                 Console.WriteLine("Position Changed!");
  240.                                 mainCameraTransform.rotation = Quaternion.LookRotation(manEye.transform.up);
  241.                                 oldTargetPos = cameraTargetPosFromScript;
  242.  
  243.                             }
  244.  
  245.                             mainCamera.SetPos(manEye.transform.position + manEye.transform.up * fpsOffsetUp + manEye.transform.right * -fpsOffsetForward);
  246.  
  247.                             mainCamera.SetTargetPos(manEye.transform.position + manEye.transform.up * fpsOffsetUp + manEye.transform.right * -fpsOffsetForward, true);
  248.                             mainCamera.SetDistance(0f, true);
  249.                         }
  250.                     }
  251.                 }
  252.             }
  253.         }
  254.  
  255.         private void ExtendedCameraHandle()
  256.         {
  257.             if (!occulusVR)
  258.             {
  259.                 if (mainCameraTransform)
  260.                 {
  261.                     //Equalsになっているが日本語キーボードだとセミコロン
  262.                     if (Input.GetKey(KeyCode.Equals))
  263.                     {
  264.                         Camera.main.fieldOfView += -cameraFOVChangeSpeed;
  265.                     }
  266.                     //Semicolonになっているが日本語キーボードだとコロン
  267.                     if (Input.GetKey(KeyCode.Semicolon))
  268.                     {
  269.                         Camera.main.fieldOfView = defaultFOV;
  270.                     }
  271.                     if (Input.GetKey(KeyCode.RightBracket))
  272.                     {
  273.                         Camera.main.fieldOfView += cameraFOVChangeSpeed;
  274.                     }
  275.                     if (Input.GetKey(KeyCode.Period))
  276.                     {
  277.                         mainCameraTransform.Rotate(0, 0, cameraRotateSpeed);
  278.                     }
  279.                     if (Input.GetKey(KeyCode.Slash))
  280.                     {
  281.                         mainCameraTransform.eulerAngles = new Vector3(
  282.                             mainCameraTransform.rotation.eulerAngles.x,
  283.                             mainCameraTransform.rotation.eulerAngles.y,
  284.                             0f);
  285.                     }
  286.                     if (Input.GetKey(KeyCode.Backslash))
  287.                     {
  288.                         mainCameraTransform.Rotate(0, 0, -cameraRotateSpeed);
  289.                     }
  290.                 }
  291.             }
  292.         }
  293.  
  294.         private void FloorMover(float moveSpeed, float rotateSpeed)
  295.         {
  296.             if (bg)
  297.             {
  298.                 Vector3 cameraForward = mainCameraTransform.TransformDirection(Vector3.forward);
  299.                 Vector3 cameraRight = mainCameraTransform.TransformDirection(Vector3.right);
  300.                 Vector3 cameraUp = mainCameraTransform.TransformDirection(Vector3.up);
  301.  
  302.                 Vector3 direction = Vector3.zero;
  303.  
  304.                 if (Input.GetKey(bgLeftMove))
  305.                 {
  306.                     direction += new Vector3(cameraRight.x, 0f, cameraRight.z) * moveSpeed;
  307.                 }
  308.                 if (Input.GetKey(bgRightMove))
  309.                 {
  310.                     direction += new Vector3(cameraRight.x, 0f, cameraRight.z) * -moveSpeed;
  311.                 }
  312.                 if (Input.GetKey(bgBackMove))
  313.                 {
  314.                     direction += new Vector3(cameraForward.x, 0f, cameraForward.z) * moveSpeed;
  315.                 }
  316.                 if (Input.GetKey(bgForwardMove))
  317.                 {
  318.                     direction += new Vector3(cameraForward.x, 0f, cameraForward.z) * -moveSpeed;
  319.                 }
  320.                 if (Input.GetKey(bgUpMove))
  321.                 {
  322.                     direction += new Vector3(0f, cameraUp.y, 0f) * -moveSpeed;
  323.                 }
  324.                 if (Input.GetKey(bgDownMove))
  325.                 {
  326.                     direction += new Vector3(0f, cameraUp.y, 0f) * moveSpeed;
  327.                 }
  328.  
  329.                 bg.position += direction;
  330.  
  331.                 if (Input.GetKey(bgLeftRotate))
  332.                 {
  333.                     bg.RotateAround(maidTransform.transform.position, Vector3.up, rotateSpeed);
  334.                 }
  335.                 if (Input.GetKey(bgRightRotate))
  336.                 {
  337.                     bg.RotateAround(maidTransform.transform.position, Vector3.up, -rotateSpeed);
  338.                 }
  339.  
  340.                 if (Input.GetKey(bgLeftPitch))
  341.                 {
  342.                     bg.RotateAround(maidTransform.transform.position, new Vector3(cameraForward.x, 0f, cameraForward.z), rotateSpeed);
  343.                 }
  344.                 if (Input.GetKey(bgRightPitch))
  345.                 {
  346.                     bg.RotateAround(maidTransform.transform.position, new Vector3(cameraForward.x, 0f, cameraForward.z), -rotateSpeed);
  347.                 }
  348.             }
  349.         }
  350.  
  351.         private void LookAtThis()
  352.         {
  353.             if (Input.GetKeyDown(KeyCode.T))
  354.             {
  355.                 if (eyeToCamIndex == Enum.GetNames(typeof(Maid.EyeMoveType)).Length - 1)
  356.                 {
  357.                     eyetoCamToggle = false;
  358.                     eyeToCamIndex = 0;
  359.                 }
  360.                 else
  361.                 {
  362.                     eyeToCamIndex++;
  363.                     eyetoCamToggle = true;
  364.                 }
  365.                 maid.EyeToCamera((Maid.EyeMoveType)eyeToCamIndex, 0f);
  366.                 Console.WriteLine("EyeToCam:{0}", eyeToCamIndex);
  367.  
  368.             }
  369.  
  370.  
  371.  
  372.             if (Input.GetKeyDown(KeyCode.G))
  373.             {
  374.                 eyetoCamToggle = !eyetoCamToggle;
  375.                 //Console.WriteLine("Eye to Cam : {0}", eyetoCamToggle);
  376.                 if (!eyetoCamToggle)
  377.                 {
  378.                     maid.EyeToCamera(Maid.EyeMoveType.無し, 0f);
  379.                     eyeToCamIndex = 0;
  380.                     Console.WriteLine("EyeToCam:{0}", eyeToCamIndex);
  381.                 }
  382.                 else
  383.                 {
  384.                     maid.EyeToCamera(Maid.EyeMoveType.目と顔を向ける, 0f);
  385.                     eyeToCamIndex = 5;
  386.                     Console.WriteLine("EyeToCam:{0}", eyeToCamIndex);
  387.                 }
  388.             }
  389.         }
  390.  
  391.         private void TimeScaleChanger()
  392.         {
  393.             if (Input.GetKey(KeyCode.At))
  394.             {
  395.                 Time.timeScale -= 0.01f;
  396.             }
  397.             if (Input.GetKey(KeyCode.LeftBracket))
  398.             {
  399.                 Time.timeScale += 0.01f;
  400.             }
  401.             if (Input.GetKey(KeyCode.P))
  402.             {
  403.                 Time.timeScale = 0f;
  404.             }
  405.             if (Input.GetKey(KeyCode.O))
  406.             {
  407.                 Time.timeScale = 1f;
  408.             }
  409.         }
  410.  
  411.         private void HideUI()
  412.         {
  413.             if (Input.GetKeyDown(KeyCode.Tab))
  414.             {
  415.                 if (sceneLevel == 5 || sceneLevel == 14)
  416.                 {
  417.  
  418.                     var field = GameMain.Instance.MainCamera.GetType().GetField("m_eFadeState", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
  419.  
  420.                     int i = (int)field.GetValue(mainCamera);
  421.                     Console.WriteLine("FadeState:{0}", i);
  422.                     if (i == 0)
  423.                     {
  424.                         uiVisible = !uiVisible;
  425.                         if (uiObject)
  426.                         {
  427.                             uiObject.SetActive(uiVisible);
  428.                         }
  429.  
  430.                     }
  431.                     Console.WriteLine("UIVisible:{0}", uiVisible);
  432.                 }
  433.             }
  434.         }
  435.  
  436.         public void Update()
  437.         {
  438.  
  439.             if (sceneLevel == 5)
  440.             {
  441.                 if (profilePanel.activeSelf)
  442.                 {
  443.                     allowUpdate = false;
  444.                 }
  445.                 else
  446.                 {
  447.                     allowUpdate = true;
  448.                 }
  449.             }
  450.             else if (sceneLevel == 12)
  451.             {
  452.                 if (profilePanel.activeSelf)
  453.                 {
  454.                     allowUpdate = false;
  455.                 }
  456.                 else
  457.                 {
  458.                     allowUpdate = true;
  459.                 }
  460.             }
  461.  
  462.             if (allowUpdate)
  463.             {
  464.                 float moveSpeed = floorMoveSpeed;
  465.                 float rotateSpeed = maidRotateSpeed;
  466.  
  467.                 if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
  468.                 {
  469.                     moveSpeed *= 0.1f;
  470.                     rotateSpeed *= 0.1f;
  471.                 }
  472.  
  473.                 //TimeScaleChanger();
  474.  
  475.                 FirstPersonCamera();
  476.  
  477.                 LookAtThis();
  478.  
  479.                 FloorMover(moveSpeed, rotateSpeed);
  480.  
  481.                 if (!occulusVR)
  482.                 {
  483.                     ExtendedCameraHandle();
  484.  
  485.                     HideUI();
  486.                 }
  487.             }
  488.         }
  489.     }
  490. }
Advertisement
Add Comment
Please, Sign In to add comment