思路是这样子的,先是保存原来物体的信息(目标位置)(包括位置、旋转、 还有父物体等信息),然后就可以修改物体的信息,使它可以展示给相机正面去看到了。怎么让相机正面看到这个物体呢?我想到最好的一个办法就是设置它为相机下的子物体,然后就可以利用参考性的本地坐标来去实现了,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(); }