using UnityEngine; using System.Collections; public class SetParentScript : MonoBehaviour { public GameObject objectA; // 想要成为子对象并且锁定/解锁的对象 public GameObject objectB; // 想要成为父对象的对象 // Adjustable positions and rotations public Vector3 positionOffset; // 调整的位置偏移量 public Vector3 rotationOffset; // 调整的旋转偏移量 private Rigidbody rbA; // objectA的Rigidbody组件 private Transform originalParent; // objectA的原始父对象 private RigidbodyConstraints originalConstraints; // objectA原始的Rigidbody约束 private Vector3 originalPosition; // objectA的原始位置 private Quaternion originalRotation; // objectA的原始旋转 void Start() { // 获取objectA的Rigidbody组件 rbA = objectA.GetComponent(); if (rbA == null) { // 如果没有找到Rigidbody组件则记录错误 Debug.LogError("没有在objectA上找到Rigidbody组件"); return; } // 保存objectA的原始父对象、位置、旋转和Rigidbody约束 originalParent = objectA.transform.parent; originalPosition = objectA.transform.position; originalRotation = objectA.transform.rotation; originalConstraints = rbA.constraints; // 锁定Rigidbody并在3秒后改变父对象和解锁 LockMotionAndRotation(); Invoke("ChangeParentAndUnlock", 3f); } void ChangeParentAndUnlock() { // 改变objectA的父对象并解锁Rigidbody SetParent(); UnlockMotionAndRotation(); } void SetParent() { // 设置objectA为objectB的子对象 objectA.transform.SetParent(objectB.transform); } void LockMotionAndRotation() { // 锁定位置和旋转通过设置Rigidbody的约束 rbA.constraints = RigidbodyConstraints.FreezePosition | RigidbodyConstraints.FreezeRotation; } void UnlockMotionAndRotation() { // 解锁所有Rigidbody约束以允许再次移动和旋转 rbA.constraints = RigidbodyConstraints.None; } public void ResetToInitialState() { // 将objectA的父对象重置为其原始父对象 objectA.transform.SetParent(originalParent); // 将objectA的位置重置为其原始位置并应用偏移量 objectA.transform.position = originalPosition + positionOffset; // 将objectA的旋转重置为其原始旋转并应用偏移量 objectA.transform.rotation = originalRotation * Quaternion.Euler(rotationOffset); // 将objectA的Rigidbody约束重置为最初的约束 rbA.constraints = originalConstraints; // 可选,重新锁定并准备在3秒后改变父对象和解锁 LockMotionAndRotation(); Invoke("ChangeParentAndUnlock", 3f); } }