using UnityEngine;
using cakeslice;

public class MoxingControl : MonoBehaviour
{
    private Transform selectedPart = null;
    private Outline outline = null;
    private GameObject axis;
    private Vector3 axisOffset = Vector3.zero;
    private Vector3 mouseOffset = Vector3.zero;
    private bool isControlEnabled = false;
    private Color selectedColor = Color.yellow;
    private Animator animator;
    private bool animatorEnabled = true;

    public GameObject axisPrefab;

    private void Start()
    {
        axis = Instantiate(axisPrefab, Vector3.zero, Quaternion.identity);
        axis.SetActive(false);
    }

    private void Update()
    {
        animator = GetComponent<Animator>();
        if (!isControlEnabled)
            return;

        if (Input.GetMouseButtonDown(0))
        {
            Transform clickedPart = GetClickedPart(transform);
            if (clickedPart != null)
            {
                if (selectedPart != null)
                {
                    Destroy(outline);
                    if (selectedPart == clickedPart)
                    {
                        selectedPart = null;
                        axis.SetActive(false);
                        return;
                    }

                }

                selectedPart = clickedPart;
                outline = selectedPart.gameObject.AddComponent<Outline>();
                //outline.OutlineColor = selectedColor;
                //outline.OutlineWidth = 2;

                axis.SetActive(true);
                axis.transform.SetParent(selectedPart.transform);
                axis.transform.localPosition = new Vector3(0, selectedPart.GetComponent<Renderer>().bounds.extents.z + 0.15f, 0);
                axisOffset = selectedPart.transform.position - axis.transform.position;
                mouseOffset = selectedPart.transform.position - Camera.main.ScreenToWorldPoint(Input.mousePosition);

            }
            else
            {
                if (selectedPart != null)
                {
                    Destroy(outline);
                    selectedPart = null;
                    axis.SetActive(false);
                }

            }

        }
        if (Input.GetMouseButton(0) && selectedPart != null)
        {
            Vector3 mousePosition = Input.mousePosition;
            mousePosition.z = axisOffset.z;
            Vector3 worldMousePosition = Camera.main.ScreenToWorldPoint(mousePosition) + mouseOffset;
            Vector3 localPosition = selectedPart.parent.InverseTransformPoint(worldMousePosition - axisOffset);
            localPosition.x = axis.transform.localEulerAngles.y == 90 ? -localPosition.x : localPosition.x;
            localPosition.y = axis.transform.localEulerAngles.x == 90 ? -localPosition.y : localPosition.y;
            localPosition.z = axis.transform.localEulerAngles.y == 0 ? -localPosition.z : localPosition.z;
            selectedPart.localPosition = new Vector3(Mathf.Round(localPosition.x * 100) / 100, Mathf.Round(localPosition.y * 100) / 100, Mathf.Round(localPosition.z * 100) / 100);
        }

    }

    private bool IsDescendant(Transform child, Transform parent)
    {
        foreach (Transform t in parent)
        {
            if (t == child)
                return true;
            if (IsDescendant(child, t))
                return true;
        }
        return false;
    }

    private Transform GetClickedPart(Transform parent)
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            Transform clickedPart = hit.transform;
            if (IsDescendant(clickedPart, parent))
            {
                return clickedPart;
            }
        }
        return null;
    }

    public void ToggleControlEnabled()
    {
        isControlEnabled = !isControlEnabled;
        animator.enabled = !animator.enabled;
    }
}修改代码，点击模型部件后，将坐标轴模型放在放在放在模型部件世界坐标y的上方0.15f处，且将模型点击的精度提高到小数点后四位。