玩卡牌遊戲一定少不了多張手牌時,
該怎麼精準的選到卡牌呢?
我利用UI Image中的 Raycast Padding,
來進行判斷範圍的調整,
請注意 因為我不知道有什麼更快的方法,
所以我全部用計算的方式去運作。
2021/10/28-最後偷工減料再用一個圖層其實比較簡單、又快速。
卡片觸發區
首先兩張牌重疊的地方(如下圖)
需要變為不可觸發的狀態,
這是有關放大後觸發的問題。
因為間距不同會導致重疊大小的不一樣
所以我修改了一下位置調整的地方。
/// <summary> /// 位置調整 /// </summary> private void PositionAdjustment(){ cardPosition = new List<Vector2>(); // 控制在一定寬度內 _width = cardWidth + maxSpacing; if(ownCards.Count > maxCard){ _width = _width / (1f + (ownCards.Count - maxCard) / (maxCard - 1)); } //是否為奇數 float odd = 1f; if(ownCards.Count % 2 == 1){ odd = 0; } //最左邊的位置 float x = -((_width * (int)(ownCards.Count / 2))) + _width / 2 * odd; float z = 4f / (maxCard - 1f) * (ownCards.Count - 1f); z = z > 4f? 4f: z; for (int i = 0; i < ownCards.Count; i++) { if(ownCards.Count > maxCard && i < ownCards.Count - 1) ownCards[i].GetComponent<Image>().raycastPadding =new Vector4(0,0, cardWidth - _width, 0); float z1 = ((float)ownCards.Count - 1f); z1 = z1 == 0 ? 1 : z1; cardLocation[i].transform.rotation = Quaternion.Euler(0f, 0f, z - (z * 2f) / z1 * i); cardPosition.Add(new Vector2(x + _width * i, transform.position.y)); } } |
稍微有小改動一些變數,
但主要是這一行
if(ownCards.Count > maxCard && i < ownCards.Count - 1) ownCards[i].GetComponent<Image>().raycastPadding =new Vector4(0,0, cardWidth - _width, 0); |
maxCard 代表最大手牌:手牌超過間距就會縮小,也就代表開始重疊。
i < ownCards.Count - 1 這會讓最後一張牌的觸發區域不保持卡牌大小。
(因為最後一張沒被任何卡片覆蓋)
放大時的範圍
我原本是想利用放大的比例差之類的去算,(如下圖)
但最後發現只要只到邊界他就會一直不斷地縮放,
今天改良了一下,
我又新增了一個圖層,
如上圖,
最底下的卡片只是圖片,不包含判斷區域,
而中間的那個卡片不會跟著圖片放大,
並且保持在原位,
也就是說判斷區域不變,
(注意記得把最底下圖片的RaycastTarget關掉,
不然會擋到判斷區域)
害我之前用運算的算了老半天,
結果還全都打掉重練
雖然有兩個功能感覺不大的圖層,
但先能達到效果,
再想怎麼優化嗎~
如果大家有啥建議的也可以推薦個。
現在大概長這樣
之後玩了一款遊戲,
感覺他的卡牌效果也蠻不錯的,
時常覺得我是不是太注重細節了,
導致我一直想修改功能,
光抽個卡就花了好久阿~
下次可能就會有戰鬥系統了吧~
應該吧~
不確定....
順便宣傳DC群
這裡包含了繪畫創作、BOT娛樂、遊戲討論、影像分享、程式交流等內容。