Guest User

CM3D2CameraUtility.Plugin

a guest
Aug 10th, 2015
2,345
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.04 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("1.1.0.1")]
  17.  
  18.     public class CameraUtility : PluginBase
  19.     {
  20.         private CameraMain mainCamera;
  21.         private Transform mainCameraTransform;
  22.         private Transform maidTransform;
  23.         private Transform bg;
  24.         private GameObject manEye;
  25.         private Maid maid;
  26.  
  27.         private float defaultFOV = 35f;
  28.         private bool allowUpdate = false;
  29.         private bool occulusVR = false;
  30.         private bool fpsMode = false;
  31.         private bool eyetoCamToggle = false;
  32.  
  33.         private float cameraRotateSpeed = 1f;
  34.         private float cameraFOVChangeSpeed = 0.25f;
  35.         private float floorMoveSpeed = 0.05f;
  36.         private float maidRotateSpeed = 2f;
  37.         private float fpsModeFoV = 60f;
  38.  
  39.         private Vector3 testDirection = Vector3.zero;
  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.  
  60.         private Vector3 oldPos;
  61.         private Vector3 oldTargetPos;
  62.         private float oldDistance;
  63.         private Quaternion oldRotation;
  64.         private bool oldEyetoCamToggle;
  65.         private int eyeToCamIndex = 0;
  66.  
  67.         public void Awake()
  68.         {
  69.             string path = Application.dataPath;
  70.             occulusVR = path.Contains("CM3D2VRx64");
  71.             GameObject.DontDestroyOnLoad(this);
  72.             if (occulusVR)
  73.             {
  74.                 bgLeftMove = KeyCode.J;
  75.                 bgRightMove = KeyCode.L;
  76.                 bgForwardMove = KeyCode.I;
  77.                 bgBackMove = KeyCode.K;
  78.                 bgUpMove = KeyCode.Alpha0;
  79.                 bgDownMove = KeyCode.P;
  80.                 bgLeftRotate = KeyCode.U;
  81.                 bgRightRotate = KeyCode.O;
  82.             }
  83.         }
  84.  
  85.         public void Start()
  86.         {
  87.             mainCameraTransform = Camera.main.gameObject.transform;
  88.         }
  89.  
  90.         public void OnLevelWasLoaded(int level)
  91.         {
  92.             sceneLevel = level;
  93.  
  94.             GameObject[] array = UnityEngine.Object.FindObjectsOfType<GameObject>();
  95.             foreach (var gameobject in array)
  96.             {
  97.                 if (gameobject.name.IndexOf("Maid[0]") > -1)
  98.                 {
  99.                     maidTransform = gameobject.transform;
  100.                 }
  101.             }
  102.  
  103.             maid = GameMain.Instance.CharacterMgr.GetMaid(0);
  104.  
  105.             bg = GameObject.Find("__GameMain__/BG").transform;
  106.  
  107.             mainCamera = GameMain.Instance.MainCamera;
  108.  
  109.  
  110.             if (maidTransform && bg && maid)
  111.             {
  112.                 allowUpdate = true;
  113.             }
  114.             else
  115.             {
  116.                 allowUpdate = false;
  117.             }
  118.  
  119.             if (!occulusVR)
  120.             {
  121.                 defaultFOV = Camera.main.fieldOfView;
  122.             }
  123.  
  124.             fpsMode = false;
  125.         }
  126.  
  127.         private void SaveCameraPos()
  128.         {
  129.             oldPos = mainCamera.GetPos();
  130.             oldTargetPos = mainCamera.GetTargetPos();
  131.             oldDistance = mainCamera.GetDistance();
  132.             oldRotation = mainCameraTransform.transform.rotation;
  133.  
  134.         }
  135.  
  136.         private void LoadCameraPos()
  137.         {
  138.             mainCameraTransform.transform.rotation = oldRotation;
  139.             mainCamera.SetPos(oldPos);
  140.             mainCamera.SetTargetPos(oldTargetPos, true);
  141.             mainCamera.SetDistance(oldDistance, true);
  142.         }
  143.  
  144.         private Vector3 GetYotogiPlayPosition()
  145.         {
  146.             var field = mainCamera.GetType().GetField("m_vCenter", BindingFlags.GetField | BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance);
  147.             return (Vector3)field.GetValue(mainCamera);
  148.         }
  149.  
  150.         private void FirstPersonCamera()
  151.         {
  152.             if (sceneLevel == 14)
  153.             {
  154.                 if (!occulusVR)
  155.                 {
  156.  
  157.                     if (!manEye)
  158.                     {
  159.                         if (frameCount == 60)
  160.                         {
  161.                             manEye = GameObject.Find("__GameMain__/Character/Active/AllOffset/Man[0]/Offset/_BO_mbody/ManBip/ManBip Spine/ManBip Spine1/ManBip Spine2/ManBip Neck/ManBip Head");
  162.                             frameCount = 0;
  163.                         }
  164.                         else
  165.                         {
  166.                             frameCount++;
  167.                         }
  168.                     }
  169.                     else
  170.                     {
  171.                         if (Input.GetKeyDown(KeyCode.F))
  172.                         {
  173.                             fpsMode = !fpsMode;
  174.                             Console.WriteLine("fpsmode = " + fpsMode.ToString());
  175.                             if (fpsMode)
  176.                             {
  177.                                 SaveCameraPos();
  178.  
  179.                                 Camera.main.fieldOfView = fpsModeFoV;
  180.                                 eyetoCamToggle = false;
  181.                                 maid.EyeToCamera(Maid.EyeMoveType.無し, 0f);
  182.  
  183.                                 mainCameraTransform.transform.rotation = Quaternion.LookRotation(manEye.transform.up);
  184.                             }
  185.                             else
  186.                             {
  187.  
  188.                                 Vector3 cameraTargetPosFromScript = GetYotogiPlayPosition();
  189.  
  190.                                 if (oldTargetPos != cameraTargetPosFromScript)
  191.                                 {
  192.                                     Console.WriteLine("Position Changed!");
  193.                                     oldTargetPos = cameraTargetPosFromScript;
  194.                                 }
  195.  
  196.                                 LoadCameraPos();
  197.                                 Camera.main.fieldOfView = defaultFOV;
  198.  
  199.                                 //mainCamera.ResetFromScriptOnTarget();
  200.                                 eyetoCamToggle = oldEyetoCamToggle;
  201.                                 oldEyetoCamToggle = eyetoCamToggle;
  202.                             }
  203.                         }
  204.  
  205.                         if (fpsMode)
  206.                         {
  207.                             Vector3 cameraTargetPosFromScript = GetYotogiPlayPosition();
  208.                             if (oldTargetPos != cameraTargetPosFromScript)
  209.                             {
  210.                                 Console.WriteLine("Position Changed!");
  211.                                 mainCameraTransform.transform.rotation = Quaternion.LookRotation(manEye.transform.up);
  212.                                 oldTargetPos = cameraTargetPosFromScript;
  213.  
  214.                             }
  215.  
  216.                             mainCamera.SetPos(manEye.transform.position + manEye.transform.up * fpsOffsetUp + manEye.transform.right * -fpsOffsetForward);
  217.  
  218.                             mainCamera.SetTargetPos(manEye.transform.position + manEye.transform.up * fpsOffsetUp + manEye.transform.right * -fpsOffsetForward, true);
  219.                             mainCamera.SetDistance(0f, true);
  220.                         }
  221.                         else
  222.                         {
  223.  
  224.                         }
  225.                     }
  226.                 }
  227.             }
  228.         }
  229.  
  230.         private void ExtendedCameraHandle()
  231.         {
  232.             if (!occulusVR)
  233.             {
  234.                 if (mainCameraTransform)
  235.                 {
  236.                     //Equalsになっているが日本語キーボードだとセミコロン
  237.                     if (Input.GetKey(KeyCode.Equals))
  238.                     {
  239.                         Camera.main.fieldOfView += -cameraFOVChangeSpeed;
  240.                     }
  241.                     //Semicolonになっているが日本語キーボードだとコロン
  242.                     if (Input.GetKey(KeyCode.Semicolon))
  243.                     {
  244.                         Camera.main.fieldOfView = defaultFOV;
  245.                     }
  246.                     if (Input.GetKey(KeyCode.RightBracket))
  247.                     {
  248.                         Camera.main.fieldOfView += cameraFOVChangeSpeed;
  249.                     }
  250.                     if (Input.GetKey(KeyCode.Period))
  251.                     {
  252.                         mainCameraTransform.Rotate(0, 0, cameraRotateSpeed);
  253.                     }
  254.                     if (Input.GetKey(KeyCode.Slash))
  255.                     {
  256.                         mainCameraTransform.eulerAngles = new Vector3(
  257.                             mainCameraTransform.rotation.eulerAngles.x,
  258.                             mainCameraTransform.rotation.eulerAngles.y,
  259.                             0f);
  260.                     }
  261.                     if (Input.GetKey(KeyCode.Backslash))
  262.                     {
  263.                         mainCameraTransform.Rotate(0, 0, -cameraRotateSpeed);
  264.                     }
  265.                 }
  266.             }
  267.         }
  268.  
  269.         private void FloorMover(float moveSpeed, float rotateSpeed)
  270.         {
  271.             if (bg)
  272.             {
  273.                 Vector3 forward = mainCameraTransform.TransformDirection(Vector3.forward);
  274.                 Vector3 right = mainCameraTransform.TransformDirection(Vector3.right);
  275.                 Vector3 up = mainCameraTransform.TransformDirection(Vector3.up);
  276.  
  277.                 Vector3 direction = Vector3.zero;
  278.  
  279.                 if (Input.GetKey(bgLeftMove))
  280.                 {
  281.                     direction += new Vector3(right.x, 0f, right.z) * moveSpeed;
  282.                 }
  283.                 if (Input.GetKey(bgRightMove))
  284.                 {
  285.                     direction += new Vector3(right.x, 0f, right.z) * -moveSpeed;
  286.                 }
  287.                 if (Input.GetKey(bgBackMove))
  288.                 {
  289.                     direction += new Vector3(forward.x, 0f, forward.z) * moveSpeed;
  290.                 }
  291.                 if (Input.GetKey(bgForwardMove))
  292.                 {
  293.                     direction += new Vector3(forward.x, 0f, forward.z) * -moveSpeed;
  294.                 }
  295.                 if (Input.GetKey(bgUpMove))
  296.                 {
  297.                     direction += new Vector3(0f, up.y, 0f) * -moveSpeed;
  298.                 }
  299.                 if (Input.GetKey(bgDownMove))
  300.                 {
  301.                     direction += new Vector3(0f, up.y, 0f) * moveSpeed;
  302.                 }
  303.  
  304.                 bg.position += direction;
  305.  
  306.                 if (Input.GetKey(bgLeftRotate))
  307.                 {
  308.                     bg.RotateAround(maidTransform.transform.position, Vector3.up, rotateSpeed);
  309.                 }
  310.                 if (Input.GetKey(bgRightRotate))
  311.                 {
  312.                     bg.RotateAround(maidTransform.transform.position, Vector3.up, -rotateSpeed);
  313.                 }
  314.             }
  315.         }
  316.  
  317.         private void LookAtThis()
  318.         {
  319.             if (Input.GetKeyDown(KeyCode.T))
  320.             {
  321.                 if (eyeToCamIndex == Enum.GetNames(typeof(Maid.EyeMoveType)).Length - 1)
  322.                 {
  323.                     eyetoCamToggle = false;
  324.                     eyeToCamIndex = 0;
  325.                 }
  326.                 else
  327.                 {
  328.                     eyeToCamIndex++;
  329.                     eyetoCamToggle = true;
  330.                 }
  331.                 maid.EyeToCamera((Maid.EyeMoveType)eyeToCamIndex, 0f);
  332.                 Console.WriteLine("EyeToCam:{0}", eyeToCamIndex);
  333.  
  334.             }
  335.  
  336.  
  337.  
  338.             if (Input.GetKeyDown(KeyCode.G))
  339.             {
  340.                 eyetoCamToggle = !eyetoCamToggle;
  341.                 //Console.WriteLine("Eye to Cam : {0}", eyetoCamToggle);
  342.                 if (!eyetoCamToggle)
  343.                 {
  344.                     maid.EyeToCamera(Maid.EyeMoveType.無し, 0f);
  345.                     eyeToCamIndex = 0;
  346.                     Console.WriteLine("EyeToCam:{0}", eyeToCamIndex);
  347.                 }
  348.                 else
  349.                 {
  350.                     maid.EyeToCamera(Maid.EyeMoveType.目と顔を向ける, 0f);
  351.                     eyeToCamIndex = 5;
  352.                     Console.WriteLine("EyeToCam:{0}", eyeToCamIndex);
  353.                 }
  354.             }
  355.         }
  356.  
  357.         private void TimeScaleChanger()
  358.         {
  359.             if (Input.GetKey(KeyCode.At))
  360.             {
  361.                 Time.timeScale -= 0.01f;
  362.             }
  363.             if (Input.GetKey(KeyCode.LeftBracket))
  364.             {
  365.                 Time.timeScale += 0.01f;
  366.             }
  367.             if (Input.GetKey(KeyCode.P))
  368.             {
  369.                 Time.timeScale = 0f;
  370.             }
  371.             if (Input.GetKey(KeyCode.O))
  372.             {
  373.                 Time.timeScale = 1f;
  374.             }
  375.         }
  376.  
  377.         public void Update()
  378.         {
  379.             if (allowUpdate)
  380.             {
  381.                 float moveSpeed = floorMoveSpeed;
  382.                 float rotateSpeed = maidRotateSpeed;
  383.  
  384.                 if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
  385.                 {
  386.                     moveSpeed *= 0.1f;
  387.                     rotateSpeed *= 0.1f;
  388.                 }
  389.  
  390.  
  391.                 //TimeScaleChanger();
  392.  
  393.                 FirstPersonCamera();
  394.  
  395.                 LookAtThis();
  396.  
  397.                 ExtendedCameraHandle();
  398.  
  399.                 FloorMover(moveSpeed, rotateSpeed);
  400.  
  401.             }
  402.         }
  403.     }
  404. }
Advertisement
Add Comment
Please, Sign In to add comment