麻将 展示后回到原位置动画

思路是这样子的,先是保存原来物体的信息(目标位置)(包括位置、旋转、 还有父物体等信息),然后就可以修改物体的信息,使它可以展示给相机正面去看到了。怎么让相机正面看到这个物体呢?我想到最好的一个办法就是设置它为相机下的子物体,然后就可以利用参考性的本地坐标来去实现了,pos位置就是参考相机的位置,这样的就很好知道数值了,设置好位置后,注意角度,展示的那个面,这里是-z轴的面,LookAt面向相机就行了,设置本地坐标全为0后就是相机的旋转了,再根据x,z的偏移计算出y轴的视觉偏差,纠正回来就ok了。展示完后,回到原来位置就好了。

IEnumerator OutCardAni(UICardControl control,Vector3 pos)
{
    if (control.allCards.Count < 1) yield break;
    Transform lastCard = control.allCards[control.allCards.Count - 1].transform;
    Vector3 oPos = lastCard.position;
    Vector3 oRot = lastCard.localEulerAngles;
    //展示给相机
    Transform oParent = lastCard.parent;
    lastCard.parent = Camera3d;
    lastCard.localPosition = pos;
    //lastCard.LookAt(-Camera3d.transform.position);
    //旋转一下偏移,3D会有视觉偏差
    lastCard.localEulerAngles = new Vector3(0, Mathf.Atan2(pos.x, pos.z) * Mathf.PI * 12, 0);  //Tan的角度
    //lastCard.localScale = new Vector3(0.8f,0.8f, 0.8f);
    yield return new WaitForSeconds(0.5f);
    if (lastCard == null) yield break;
    lastCard.parent = oParent;
    lastCard.localScale = Vector3.one;
    //yield break;
    int frame = 5;
    Vector3 offP = (lastCard.position - oPos) / frame;
    Vector3 offR = (lastCard.localEulerAngles - oRot) / frame;
    for (int i = 0; i < frame; i++)
    {
        if (lastCard == null) yield break;
        lastCard.position = lastCard.position - offP;
        lastCard.localEulerAngles = lastCard.localEulerAngles - offR;
        yield return new WaitForEndOfFrame();
    }

    //音效
    PlayGameSound(SoundType.OUTCARD);

    //箭头指向他
    if (lastCard != null)
    {
        SetDiscardArrow(true, lastCard.transform);
    }
            

    //yield return new WaitForEndOfFrame();
}


11.gif


首页 我的博客
粤ICP备17103704号