void Start()
 {
     homePos = transform.localPosition;
     homeRot = transform.root.localRotation;
     status  = DoorPanelStatus.CLOSE;
     pending = DoorPanelStatus.CLOSE;
 }
 void Update()
 {
     if (status == DoorPanelStatus.MOVING)
     {
         if (transform.localPosition != targetPos || transform.root.localRotation != targetRot)
         {
             float f = (Time.time - baseTime) / movementTime;
             if (f > 1f)
             {
                 f = 1f;
             }
             if (transform.localPosition != targetPos)
             {
                 transform.localPosition = Vector3.Lerp(startPos, targetPos, f);
             }
             if (transform.root.localRotation != targetRot)
             {
                 transform.root.localRotation = Quaternion.Lerp(startRot, targetRot, f);
             }
             if (f >= 1f)
             {
                 transform.localPosition      = targetPos;
                 transform.root.localRotation = targetRot;
                 status = pending;
                 if (DoneCall != null)
                 {
                     DoneCall();
                 }
             }
         }
     }
 }
 public void Close(float t)
 {
     if (status != DoorPanelStatus.CLOSE && pending != DoorPanelStatus.CLOSE)
     {
         startPos     = transform.localPosition;
         startRot     = transform.root.localRotation;
         targetPos    = homePos;
         targetRot    = homeRot;
         baseTime     = Time.time;
         movementTime = t;
         status       = DoorPanelStatus.MOVING;
         pending      = DoorPanelStatus.CLOSE;
     }
 }
    public void Open(DoorMode dm, float t)
    {
        if (status != DoorPanelStatus.OPEN && pending != DoorPanelStatus.OPEN)
        {
            startPos = transform.localPosition;
            startRot = transform.root.localRotation;
            switch (dm)
            {
            case DoorMode.SLIDE_UP:
                targetPos = homePos + Vector3.up;
                targetRot = homeRot;
                break;

            case DoorMode.SLIDE_DOWN:
                targetPos = homePos + Vector3.down;
                targetRot = homeRot;
                break;

            case DoorMode.SLIDE_RIGHT:
                targetPos = homePos + Vector3.right;
                targetRot = homeRot;
                break;

            case DoorMode.SLIDE_LEFT:
                targetPos = homePos + Vector3.left;
                targetRot = homeRot;
                break;

            case DoorMode.SWING_RIGHT:
                targetPos = homePos + transform.InverseTransformPoint(transform.position + (Vector3.forward + Vector3.left) * transform.root.localScale.x / 2f);
                targetRot = Quaternion.Euler(new Vector3(0f, 90f, 0f)) * homeRot;
                break;

            case DoorMode.SWING_LEFT:
                targetPos = homePos + transform.InverseTransformPoint(transform.position + (Vector3.forward + Vector3.right) * transform.root.localScale.x / 2f);
                targetRot = Quaternion.Euler(new Vector3(0f, -90f, 0f)) * homeRot;
                break;

            default:
                return;
            }
            baseTime     = Time.time;
            movementTime = t;
            status       = DoorPanelStatus.MOVING;
            pending      = DoorPanelStatus.OPEN;
        }
    }