优化了手牌的显示
想要的效果是手牌会像扇形一样摊开。 然后鼠标移上去这张牌就会放大。
重新写了手牌显示的方式。 因为是扇形展开,所以实际上,每一张卡牌的中心点,都位于这个扇形的弧线上。 首先要确定的是,这条弧线所在圆的表达式。 因此需要三个参数:圆心坐标(x,y)和半径r
private const float R = 2100.0f;//半径 private const float Y = 2000.0f;//圆心Y值圆心Y值与半即R是我设置的一个常量,可以适当调整,但是R-Y的值,就是位于中间的这张牌的Y的坐标值,所以R-Y应当为一个适当的固定值。 圆心X值就是屏幕的中心位置,即
float p0 = Screen.width/2;然后,要给每一张卡牌分配角度, 比如手牌有5张牌,则每张牌应为-10,-5,0,5,10这个角度。 另外还需确定卡牌的角度范围,比如只能位于-10°~10°之间。 因此,可以先通过卡牌数量,来求得相邻两张卡牌之间的角度间隔。
//计算每张牌之间的角度间隔 float deg_space; if (count < 2) { deg_space = 0; } else { deg_space = 2*CARD_ROTATE_DEGREE_LIMIT/(count-1); if (deg_space > 5) deg_space = 5; }有了角度间隔,就可以求出每张卡牌对应的角度了。
//遍历刷新每张牌的角度与位置 int i = 0; foreach (Transform tf in HandPile_Parent.transform) { //计算角度 float deg = (deg_space*i)-(deg_space*(count-1)/2); //通过角度,计算坐标位置 float x = Mathf.Sin(deg*Mathf.Deg2Rad)*R+p0; float y = Mathf.Cos(deg*Mathf.Deg2Rad)*R-Y; //设置坐标位置 tf.localPosition = new Vector3(x, y, 0); //设置角度 tf.rotation = Quaternion.Euler(new Vector3(0,0,-deg)); i++; }卡牌缩放功能与之前做的卡牌选择的状态机有交叉重叠的地方。 就用了并发状态机的思路。 一开始处于监听状态。 当监听到了鼠标移入时,就进入放大状态。 若处于放大状态时,鼠标移出卡牌去选择目标了,此时应该不会缩小回去,因此放大状态时可以进入被选择状态。 缩小状态时添加了一个动画效果,使缩小显得更加流畅。 由于Scaler每秒都会-5,这个速度太快,所以很容易会把卡牌缩小到0.8这样的数字,因此有必要在这个缩小动画完成之后,对缩放值进行一次重设,重设成1.0。 在缩小的过程中,但还未完成时,若鼠标再次进入,则仍然要可以放大,所以缩小状态也有一个变化可以转向放大状态。 本来想在放大状态也做一个这样的动画,但是由于放大时会将整个卡牌向上位移,若是鼠标自卡牌底部进入卡牌时,如果有动画的话,就会出现鼠标因为卡牌向上位移所以触发了鼠标离开,然后卡牌缩小回去又触发了鼠标进入,于是开始不停的放大缩小的鬼畜效果,只好作罢。
目前需要Unity开发程序员、UI美术、二次元人物原画师 数值、关卡、剧情等策划如果有兴趣也可以来聊一聊交流交流 如果有想参与项目的小伙伴,或者只是单纯想交朋友的,都可以添加我QQ:425202998