游戏案例——月圆之夜卡牌展示

2019-07-18  本文已影响0人  雷小雷LL
先上效果图
效果图.png
思路:用到三角形内角和为180°,余弦定理,正弦定理等与三角形相关的属性。其实解决卡牌显示就是一道数学几何题。
几何图如图
几何图.png
求得∠ADG的角度即为每张牌应该旋转的角度值△α , x增量△x,y增量△y
已知AB,DE,r = AD = CD = BD = DG
r² = DH² + GH² 
r² = AE² + ED² 
tan∠ADC = AE / ED           // AE已知,DE已知 , 求出 α = ∠ADC
可求出r = ED / cos∠ADC      // tan∠ADC已知,求出r
已知有x张牌
△α = α / x  
β = ∠GDH = △α*( i - 1 ) - α     //这里要分正负,参考正弦函数图
求出△x增量为 r*sinβ
求出△y增量为 r*cosβ - ED

核心代码如下:

 public void SortCard()
{
    int num = cardItem.Count;
    beYondNum = num;
    Debug.Log("列表长度为:" + num);
    float width = 2 * Screen.width / (3 * maxWidNum) * num; //张开宽度 , 屏幕分辨率的一半/maxWidNum张牌
    if (num >= maxWidNum)
    {
        width = Screen.width / 2;
    }
    float h0 = height;
    float angle = 0;
    float deaAngle = 0;
    if (num > 1)
    {
        angle = Mathf.Atan((width / 2) / h0) * (180 / Mathf.PI);
        deaAngle = 2 * angle / (num - 1);
    }
    float r = Mathf.Abs(h0 / (Mathf.Cos((Mathf.PI / 180) * angle)));
    for (int i =0; i < num; i++)
    {
        float disWidth = r * Mathf.Sin((Mathf.PI / 180) * (deaAngle * i - angle));
        cardItem[i].rectTransform.eulerAngles = new Vector3(0, 0, angle - deaAngle * i);
        float h = 0;
        h = r * Mathf.Cos((Mathf.PI / 180) * (deaAngle * i - angle)) - h0;
        cardItem[i].rectTransform.localPosition = new Vector3(disWidth, h, 0);
    }
}
注:在Unity中需要注意弧度与角度的转化
上一篇 下一篇

猜你喜欢

热点阅读