You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何为Card ScriptableObject添加召唤时触发的卡牌效果

实现步骤

1. 修复并调整EffectManager

先处理现有EffectManager的笔误+改为单例方便全局调用,同时把私有方法mill改为公有,否则外部无法触发:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EffectManager : MonoBehaviour
{
    // 单例实例,全局可直接访问
    public static EffectManager Instance;
    
    Deck dk;
    Hand hnd;
    Player p1; // 修复原代码笔误:Awake里错误赋值给了不存在的jg1,这里统一用p1
    
    private void Awake()
    {
        // 单例初始化
        if (Instance == null) Instance = this;
        else Destroy(gameObject);
        
        dk = FindObjectOfType<Deck>();
        hnd = FindObjectOfType<Hand>();
        p1 = FindObjectOfType<Player>();
    }

    public void Draw(int num)
    {
        p1.DrawCards(num);
    }

    public void Discard()
    {
        hnd.hand.RemoveAt(0);
    }
    // 改为public,允许外部调用
    public void Mill()
    {
        dk.deck.RemoveAt(0);
    }
}

2. 为Card添加效果关联逻辑

首先定义卡牌效果的枚举,方便在Inspector面板直接为每个卡牌选择对应效果:

// 可以单独放在一个脚本里,也可以直接写在Card脚本上方
public enum CardEffectType
{
    None, // 无效果
    Draw, // 抽卡
    Discard, // 弃牌
    Mill // 爆牌
}

然后修改Card的ScriptableObject,添加效果相关字段和触发方法:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "New Card", menuName = "Card")]
public class Card : ScriptableObject
{
    public string m_cardName;
    public Sprite m_sprite;

    public int m_manaCost;
    public int m_health;
    public int m_attack;

    [Header("卡牌效果设置")]
    public CardEffectType effectType;
    // 效果参数,比如抽卡数量就存在这里
    public int effectParam = 1;

    // 召唤时触发的效果方法
    public void OnSummon()
    {
        switch (effectType)
        {
            case CardEffectType.Draw:
                EffectManager.Instance.Draw(effectParam);
                break;
            case CardEffectType.Discard:
                EffectManager.Instance.Discard();
                break;
            case CardEffectType.Mill:
                EffectManager.Instance.Mill();
                break;
            case CardEffectType.None:
            default:
                break;
        }
    }
}

3. 在召唤逻辑中触发效果

在你现有卡牌召唤成功的逻辑位置,调用当前被召唤卡牌的OnSummon方法即可,示例逻辑如下:

// 你的召唤卡牌方法示例
public void SummonCard(Card cardToSummon)
{
    // 原有召唤逻辑:扣除费用、生成卡牌实体、上场展示等
    // ...

    // 新增:触发卡牌入场效果
    cardToSummon.OnSummon();
}

可选进阶优化

如果后续需要支持一张卡带多个效果、或者自定义复杂效果,可以改用效果ScriptableObject方案:定义一个基类BaseCardEffectSO,写虚方法Execute(),每个效果单独做继承自基类的SO,Card里存List<BaseCardEffect>,触发时遍历执行即可,灵活度更高。

内容的提问来源于stack exchange,提问作者Cobalixe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:45:00