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; } }