Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/ModelViewerManager.cs
2026-02-21 16:45:37 +08:00

263 lines
6.6 KiB
C#

using BitStrap;
using UnityEngine;
using UnityEngine.PostProcessing;
using UnityEngine.UI;
public class ModelViewerManager : MonoBehaviour
{
public Camera modelCamera;
public RenderTexture renderTextureSmall;
public RenderTexture renderTextureBig;
public Color bgColorSmall = Color.black;
public Color bgColorBig = Color.black;
public Transform modelParent;
public Text header;
private Rigidbody modelParentRigidbody;
[ReadOnly]
public ModelViewerObject currentObject;
[ReadOnly]
public bool isBigView;
[ReadOnly]
public bool rotateSmall = true;
public bool rotate = true;
public float baitSizeFactor = 16f;
[Header("Animations")]
public float zoomSpeed = 1f;
public float rotateSpeed = 30f;
public float rotateBigSpeed = 10f;
public float inputRotateSpeed = 30f;
public float inputRotateForce = 1500f;
[ReadOnly]
public ModelViewerObject myPrefab;
[ReadOnly]
public EquipmentObject equipmentObject;
private void Awake()
{
Initialize();
}
public void Initialize()
{
modelParentRigidbody = modelParent.GetComponent<Rigidbody>();
modelCamera.targetTexture = renderTextureSmall;
modelCamera.fieldOfView = 60f;
}
public void InstantiateObject(EquipmentObject selectedObject)
{
equipmentObject = selectedObject;
if (equipmentObject != null)
{
InstantiateObject(equipmentObject.prefab.GetComponent<ModelViewerObject>(), selectedObject.GetFullName());
}
else
{
InstantiateObject(null, string.Empty);
}
}
public void InstantiateObject(ModelViewerObject prefab, string objectName)
{
if ((bool)currentObject)
{
Object.DestroyImmediate(currentObject.gameObject);
}
modelParent.transform.localPosition = Vector3.zero;
rotate = true;
myPrefab = prefab;
if ((bool)prefab)
{
currentObject = Object.Instantiate(prefab);
currentObject.transform.parent = modelParent;
Utilities.SetLayerRecursively(currentObject.gameObject, LayerMask.NameToLayer("Bait"));
currentObject.modelViewerManager = this;
currentObject.Initialize();
currentObject.transform.localScale = prefab.transform.localScale;
if (header != null)
{
header.text = Utilities.GetTranslation(objectName);
}
if (currentObject.gameObject.HasTag("FISH"))
{
modelParent.localEulerAngles = new Vector3(0f, -120f, 0f);
Fish component = currentObject.gameObject.GetComponent<Fish>();
if (component.mainMaterialId == 0)
{
component.rigRenderer.material = component.watchMaterial;
}
else
{
component.rigRenderer.materials[component.mainMaterialId] = component.watchMaterial;
}
}
}
else
{
equipmentObject = null;
}
}
private void Update()
{
if (GlobalSettings.Instance.turnOnCheats)
{
if (Input.GetKeyDown(KeyCode.V))
{
if (modelCamera.clearFlags == CameraClearFlags.Skybox)
{
modelCamera.clearFlags = CameraClearFlags.Color;
modelCamera.GetComponent<PostProcessingBehaviour>().enabled = false;
}
else
{
modelCamera.clearFlags = CameraClearFlags.Skybox;
modelCamera.GetComponent<PostProcessingBehaviour>().enabled = true;
}
}
if (Input.GetKeyDown(KeyCode.R))
{
rotateSmall = !rotateSmall;
}
if (Input.GetKeyDown(KeyCode.Mouse2))
{
rotate = !rotate;
}
}
if (isBigView)
{
if (VRManager.IsVROn())
{
float axis = VRInputManager.GetAxis("LOOK_VERTICAL");
float axis2 = VRInputManager.GetAxis("LOOK_HORIZONTAL");
if (Mathf.Abs(axis2) > 0.1f && Mathf.Abs(axis) < 0.3f)
{
if (Time.deltaTime != 0f)
{
modelParentRigidbody.AddTorque(modelParent.up * axis2 * Time.deltaTime * inputRotateForce * 0.3f);
}
else
{
Vector3 localEulerAngles = modelParent.localEulerAngles + new Vector3(0f, axis2 * Time.unscaledDeltaTime * inputRotateSpeed, 0f);
if (localEulerAngles.y > 360f)
{
localEulerAngles.y -= 360f;
}
else if (localEulerAngles.y < 0f)
{
localEulerAngles.y += 360f;
}
modelParent.localEulerAngles = localEulerAngles;
}
}
else if (Mathf.Abs(axis) > 0.1f && Mathf.Abs(axis2) < 0.3f)
{
modelCamera.fieldOfView += zoomSpeed * (0f - axis) * Time.unscaledDeltaTime * 0.3f;
modelCamera.fieldOfView = Mathf.Clamp(modelCamera.fieldOfView, 30f, 90f);
}
if (rotate && Mathf.Abs(axis2) < 0.1f && !currentObject.gameObject.HasTag("FISH"))
{
modelParent.localEulerAngles += modelParent.up * rotateSpeed * Time.unscaledDeltaTime;
}
}
else
{
if (rotate && !Input.GetKey(KeyCode.Mouse1) && !currentObject.gameObject.HasTag("FISH"))
{
modelParent.localEulerAngles += modelParent.up * rotateSpeed * Time.unscaledDeltaTime;
}
if (Input.GetAxis("Mouse ScrollWheel") != 0f)
{
modelCamera.fieldOfView += zoomSpeed * ((!(Input.GetAxis("Mouse ScrollWheel") < 0f)) ? (-1f) : 1f) * Time.unscaledDeltaTime;
modelCamera.fieldOfView = Mathf.Clamp(modelCamera.fieldOfView, 30f, 90f);
}
}
}
else if (rotateSmall && rotate && (bool)currentObject && !currentObject.gameObject.HasTag("FISH"))
{
modelParent.localEulerAngles += modelParent.up * rotateSpeed * Time.unscaledDeltaTime;
}
if (Time.deltaTime == 0f)
{
UpdateRotateInput();
}
}
private void FixedUpdate()
{
if (Time.deltaTime != 0f)
{
UpdateRotateInput();
}
}
public void UpdateRotateInput()
{
if (VRManager.IsVROn() || !isBigView || !Input.GetKey(KeyCode.Mouse1) || Input.GetAxis("Mouse X") == 0f)
{
return;
}
if (Time.deltaTime != 0f)
{
modelParentRigidbody.AddTorque(modelParent.up * (0f - Input.GetAxis("Mouse X")) * Time.deltaTime * inputRotateForce);
return;
}
Vector3 localEulerAngles = modelParent.localEulerAngles + new Vector3(0f, (0f - Input.GetAxis("Mouse X")) * Time.unscaledDeltaTime * inputRotateSpeed, 0f);
if (localEulerAngles.y > 360f)
{
localEulerAngles.y -= 360f;
}
else if (localEulerAngles.y < 0f)
{
localEulerAngles.y += 360f;
}
modelParent.localEulerAngles = localEulerAngles;
}
public void ChangeView(bool big)
{
if (!(currentObject == null))
{
modelCamera.targetTexture = ((!big) ? renderTextureSmall : renderTextureBig);
modelCamera.fieldOfView = 60f;
modelParentRigidbody.velocity = Vector3.zero;
modelParentRigidbody.angularVelocity = Vector3.zero;
if (currentObject.gameObject.HasTag("FISH"))
{
modelParent.localEulerAngles = new Vector3(0f, -120f, 0f);
}
else
{
modelParent.localEulerAngles = new Vector3(0f, -90f, 0f);
}
isBigView = big;
}
}
[Button]
public void SavePng()
{
string pngOutPath = Application.dataPath + "/" + currentObject.name + ".png";
Utilities.RenderTextureToPng(renderTextureBig, pngOutPath);
}
}