ZhangZhouSpecialEquipment/Assets/Scripts/起重机/CraneController.cs

232 lines
5.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using UnityEngine;
public class CraneController : MonoBehaviour
{
public static CraneController Instance;
[Header("物体")]
public Transform bridge; // 横杆
public Transform hook; // 滑轮
public SkinnedMeshRenderer hookRenderer;//吊钩
[Header("移动速度")]
[Range(1, 10)]
public float bridgeSpeed = 5f; // 横杆移动速度
[Range(1, 10)]
public float hookSpeed = 5f; // 滑轮移动速度
public float blendShapeSpeed = 30f;
[Header("移动范围限制 (Z轴)")]
[Range(-1, -20)]
public float bridgeMinZ = -5f;
[Range(1, 20)]
public float bridgeMaxZ = 5f;
[Range(-1, 5)]
public float hookMinZ = -3f;
[Range(1, 5)]
public float hookMaxZ = 3f;
[Header("BlendShape设置")]
public int hookBlendShapeIndex = 0; // BlendShape索引通常是0
public float minBlendShapeValue = 0f; // 吊钩收起
public float maxBlendShapeValue = 100f; // 吊钩放下
private float currentBlendValue = 0f;
private float baseColliderZ;
private float Max = 0f;
private float Min = 0f;
public BoxCollider hookCollider; //钩子的碰撞
[Header("ui控制器")]
public GameObject UIController;
// 按钮控制标志
private bool isBridgeForward = false;
private bool isBridgeBackward = false;
private bool isHookLeft = false; // 对应 J 键 (input=1, 向 -x 移动)
private bool isHookRight = false; // 对应 L 键 (input=-1, 向 +x 移动)
private bool isHookUp = false; // 对应 U 键 (上升)
private bool isHookDown = false; // 对应 O 键 (下降)
private void Awake()
{
Instance = this;
}
public void Start()
{
Max = -(2.49513f - 0.5113189f) / 100;
Min = (6.295807f - 0.3099952f) / 100;
}
// Update is called once per frame
void Update()
{
HandleBridgeMovement();
HandleHookMovement();
HandleHookLift();
hookSize();
}
private void OnMouseDown()
{
UIController.SetActive(true);
}
void HandleBridgeMovement()
{
// I/K 或按钮控制横杆前后
float input = 0f;
// 键盘输入
if (Input.GetKey(KeyCode.I))
input += 1f;
if (Input.GetKey(KeyCode.K))
input -= 1f;
// 按钮输入
if (isBridgeForward)
input += 1f;
if (isBridgeBackward)
input -= 1f;
// 限制输入范围,避免超速
input = Mathf.Clamp(input, -1f, 1f);
Vector3 newPos = bridge.position + Vector3.forward * input * bridgeSpeed * Time.deltaTime;
newPos.z = Mathf.Clamp(newPos.z, bridgeMinZ, bridgeMaxZ);
bridge.position = newPos;
}
void HandleHookMovement()
{
// J/L 或按钮控制滑轮前后
float input = 0f;
// 键盘输入
if (Input.GetKey(KeyCode.J))
input += 1f; // input=1向 -x 移动
if (Input.GetKey(KeyCode.L))
input -= 1f; // input=-1向 +x 移动
// 按钮输入
if (isHookLeft)
input += 1f;
if (isHookRight)
input -= 1f;
// 限制输入范围,避免超速
input = Mathf.Clamp(input, -1f, 1f);
Vector3 newPos = hook.position + Vector3.left * input * hookSpeed * Time.deltaTime;
newPos.x = Mathf.Clamp(newPos.x, hookMinZ, hookMaxZ);
hook.position = newPos;
}
void HandleHookLift()
{
if (hookRenderer == null)
return;
float input = 0f;
// 键盘输入
if (Input.GetKey(KeyCode.U))
input += 1f; // 上升
if (Input.GetKey(KeyCode.O))
input -= 1f; // 下降
// 按钮输入
if (isHookUp)
input += 1f;
if (isHookDown)
input -= 1f;
// 限制输入范围,避免超速
input = Mathf.Clamp(input, -1f, 1f);
currentBlendValue += input * blendShapeSpeed * Time.deltaTime;
currentBlendValue = Mathf.Clamp(currentBlendValue, minBlendShapeValue, maxBlendShapeValue);
hookRenderer.SetBlendShapeWeight(hookBlendShapeIndex, currentBlendValue);
}
public void hookSize()
{
if (hookCollider != null)
{
hookCollider.center = new Vector3(-0.1262663f, -0.01883008f, -0.5113189f + currentBlendValue * Max);
hookCollider.size = new Vector3(0.1096101f, 0.2627291f, 0.3099952f + currentBlendValue * Min);
}
}
// ========== 按钮控制公共方法 ==========
// 桥前进 (对应 I 键)
public void StartBridgeForward()
{
isBridgeForward = true;
}
public void StopBridgeForward()
{
isBridgeForward = false;
}
// 桥后退 (对应 K 键)
public void StartBridgeBackward()
{
isBridgeBackward = true;
}
public void StopBridgeBackward()
{
isBridgeBackward = false;
}
// 钩子左移 (对应 J 键,向 -x)
public void StartHookLeft()
{
isHookLeft = true;
}
public void StopHookLeft()
{
isHookLeft = false;
}
// 钩子右移 (对应 L 键,向 +x)
public void StartHookRight()
{
isHookRight = true;
}
public void StopHookRight()
{
isHookRight = false;
}
// 钩子上? (对应 U 键)
public void StartHookUp()
{
isHookUp = true;
}
public void StopHookUp()
{
isHookUp = false;
}
// 钩子下降 (对应 O 键)
public void StartHookDown()
{
isHookDown = true;
}
public void StopHookDown()
{
isHookDown = false;
}
}