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