Unity实现杀戮尖塔出牌效果(二.鼠标指向卡牌时,卡牌强调动画)

本文详细描述了一个游戏中鼠标指向卡牌时的动画效果,包括单卡的层级提升、旋转归零和选中卡牌对附近卡牌的推开效果。核心代码展示了如何控制卡牌的位置、旋转和层级变化,以及射线检测和卡牌状态刷新的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二. 鼠标指向卡牌时,卡牌强调动画

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;  
}

附件:
卡面资源
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值