二. 鼠标指向卡牌时,卡牌强调动画
1. 单卡效果
①卡牌高度提升
②卡牌旋转归零
③卡牌层级高于其他手牌
2. 整体效果
①选中卡牌会将附近卡牌推开
核心代码展示
这里只展示此效果核心代码内容,重复代码不做赘述,上期(一.扇形开牌)完整版传送门
1. 单卡效果
当前鼠标选中的卡牌标记isSelect==true,当前选中卡牌新增效果:1.半径增加 2.卡牌层级提高,使卡牌展示位于所有手牌之上 3.卡牌旋转归零
// -->clase CardItemd 代码片段展示
/// <summary>
/// 当前卡牌是否被选中
/// </summary>
public bool isSelect;
public void SetPos()
{
//选中卡牌半径增加
float radius = isSelect ? size + 0.2f : size;
//选中卡牌层级提高,使卡牌展示位于所有手牌之上
float selectZ = isSelect ? this.zPos - 0.1f : this.zPos;
//选中卡牌旋转归零
float rotZ =isSelect?0:GetAngleInDegrees( root,transform.position);
//设置卡牌位置
float x = root.x + Mathf.Cos(rot) * radius;
float y = isSelect?-2.85f: root.y + Mathf.Sin(rot) * radius;
transform.position = Vector3.Lerp(transform.position, new Vector3(x, y, root.z+selectZ), Time.deltaTime * animSpeed);
Quaternion rotationQuaternion = Quaternion.Euler(new Vector3(0, 0, rotZ));
transform.rotation = Quaternion.RotateTowards(transform.rotation, rotationQuaternion, Time.deltaTime * animSpeed * 30);
}
射线检测当前鼠标选中卡牌
// -->clase CardManager 代码片段展示
/// <summary>
/// 选中卡牌检测
/// </summary>
public void SelectItemDetection()
{
if (oldmousePosition==Input.mousePosition)
{ return;
}
oldmousePosition = Input.mousePosition;
// 从鼠标位置创建一条射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
LayerMask layerMask = LayerMask.GetMask("Card");
// 检测射线是否与物体相交
if (Physics.Raycast(ray, out hit,1000, layerMask))
{
if (hit.collider.gameObject!=null)
{
NowSelectItem = hit.collider.gameObject.GetComponent<CardItem>();
return;
}
} NowSelectItem = null;
}
刷新当前选中的卡牌状态
// -->clase CardManager 代码片段展示
private CardItem nowSelectItem;
/// <summary>
/// 当前鼠标指向的卡牌
/// </summary>
public CardItem NowSelectItem
{
get => nowSelectItem;
set
{
if (nowSelectItem!=value)
{
nowSelectItem = value;
RefreshSelectItem(nowSelectItem);
}
}
}
/// <summary>
/// 刷新当前选中的卡牌
/// </summary>
/// <param name="selectItem"></param>
public void RefreshSelectItem(CardItem selectItem)
{
if (cardList==null)
{
return;
}
for (int i = 0; i < cardList.Count; i++)
{
cardList[i].isSelect = cardList[i]==selectItem;
}
}
2. 整体效果
①选中卡牌会将附近卡牌推开
// -->clase CardManager 代码片段展示
/// <summary>
/// 手牌状态刷新
/// </summary>
public void RefereshCard()
{
if (cardList==null)
{ return;
} int TaskIndex = 0;
//得到当前选中的卡牌下标
bool isTaskIndex=GetTaskIndex(out TaskIndex);
for (int i = 0; i < cardList.Count; i++)
{
//卡牌偏移量
float shifting = 0;
//偏移基础值
float indexNowNumber = 0.0042f;
//选中卡牌与当前卡牌之间的距离
float Difference = TaskIndex - i;
//归一化,最大影响范围为4
float absDifference = Difference > 0 ? 4-Difference : 4+Difference;
if (absDifference<0)
{
absDifference = 0;
}
//非当前选中卡牌偏移处理
if (isTaskIndex&&TaskIndex!=i)
{
shifting = (TaskIndex > i) ? indexNowNumber*absDifference : -indexNowNumber*absDifference;
}
cardList[i].RefreshData(rootPos,rotPos[i]+shifting,size,i);
}
}
/// <summary>
/// 得到当前选中的卡牌下标
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public bool GetTaskIndex(out int index)
{
index = 0;
for (int i = 0; i < cardList.Count; i++)
{
if ( cardList[i].isSelect)
{
index = i;
return true;
}
}
return false;
}
附件:
卡面资源