【Unity 入门教程】四、如何制作一个 Perfab

前言

Perfab 相当于是一个包含 UI + Logic 的基础 UI 组件,它能满足我们游戏开发中需要的基础功能,而仅需要修改不同的参数,就可以满足日常开发。

现在,那我们就开始制作一个卡牌 Perfab 吧 !!

一、核心模块梳理

1. 卡牌数据结构

制作一个卡牌类的 Perfab ,首先需要能记录当前卡牌的基本信息(血量、攻击力、卡牌名称等),因此,需要先定义一个卡牌数据结构。

用 ScriptableObject 或普通 C# 类存储卡牌属性。

在 Scripts/ 下新建 CardData.cs:

c# 复制代码
[CreateAssetMenu(fileName = "NewCard", menuName = "Card")]
public class CardData : ScriptableObject
{
    public string cardName; // 卡牌名称
    public int attack; // 攻击力
    public int health; // 血量
    public Sprite artwork; // 卡牌背景
}

2. 创建卡牌资源对象

在 ScriptableObjects/ 右键 → Create → Card → 填写卡牌属性(卡牌名称、攻击力、血量、背景图)。

此处,我定义了三张卡牌,名称,攻击力,血量数值分别是:

  • 平民卡:1-1
  • 中级卡:2-2
  • 高级卡:3-3

3.编写卡牌脚本

  1. 在场景里构建卡牌的原型(Hierarchy)

在 Hierarchy 中选中 Canvas,右键 → UI → Image,重命名为 CardUI(这是卡牌的根节点/背景)。

  • RectTransform:设置 Width = 160、Height = 220(根据你的美术调整)。
  • Anchor 推荐用 Middle Center(便于手动布局)。
  • Image 组件的 Source Image 可设置为卡牌底图(或设置透明度为0)。
  1. 在 CardUI 下创建子对象:
  • Artwork:右键 CardUI → UI → Image。这个放卡牌插画,重命名 Artwork
    • RectTransform:Anchor 设置为 Stretch(上下左右拉伸),留出上下边距(例如 Top/Botom padding)。
    • 添加组件:AspectRatioFitter(Component → Layout → Aspect Ratio Fitter),Aspect Mode = Fit In Parent,这样图片按比例缩放。
  • NameText:右键 CardUI → UI → Text - TextMeshPro(TMP)。放在卡牌顶部居中。
    • 设置 Auto Size 或固定 Font Size(例如 18),对齐居中。
  • AttackText:右键 CardUI → UI → Text - TextMeshPro,重命名 AttackText,放左下角。
  • HealthText:同上,HealthText,放右下角。
  1. 给 CardUI 根节点加一个 LayoutElement
  • (Component → Layout → Layout Element)
  • 把 Preferred Width/Height 设为上面的 100 x 150(方便用 Horizontal/Vertical Layout Group 排列手牌时保持一致)。
  1. 调整每个 Text(TMP)的颜色、字体大小、对齐方式,确保在白色或底色上可见。
  • 可以试着改 AttackText 为红色
  • HealthText 为绿色
  • 名字为黑色或白色取决于背景。

4. 添加脚本(CardUI脚本)并挂载

在 Assets/Scripts/ 新建脚本 CardUI.cs

c# 复制代码
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class CardUI : MonoBehaviour
{
    [Header("UI Elements")]
    public Image artworkImage;
    public TextMeshProUGUI nameText;
    public TextMeshProUGUI attackText;
    public TextMeshProUGUI healthText;

    private CardData data;

    public void Setup(CardData cardData)
    {
        data = cardData;
        if (nameText != null) nameText.text = data.cardName;
        if (attackText != null) attackText.text = data.attack.ToString();
        if (healthText != null) healthText.text = data.health.ToString();
        if (artworkImage != null) artworkImage.sprite = data.artwork;
    }
}

操作:

  1. 保存脚本后回 Unity 等待编译通过(Console 无报错)。
  2. 把 CardUI.cs 拖到 CardUI(Hierarchy 根节点)上作为组件。
  3. 在 Inspector 的 CardUI (Script) 面板,把字段对应拖入:
    • ArtworkImage → 拖 CardUI/Artwork 的 Image 组件
    • NameText → 拖 CardUI/NameText 的 TextMeshProUGUI
    • AttackText → 拖 AttackText(TMP)
    • HealthText → 拖 HealthText(TMP)

注意:字段为空会导致显示不出来,所以必须绑定。

5. 生成 Perfab 模块

选中 CardUI(Hierarchy),把它直接拖到 Project → Assets/Prefabs/ 文件夹里。

会在 Project 面板生成一个 CardUI.prefab。这就是你的 Prefab 资产。

相关推荐
avi91112 小时前
Unity Data Excel读取方法+踩坑记;和WPS Excel的一些命令
unity·游戏引擎·excel·wps·data
郁闷的网纹蟒3 小时前
虚幻5---第12部分---蒙太奇
开发语言·c++·ue5·游戏引擎·虚幻
天人合一peng3 小时前
Unity 中Canvas 或image打勾时不显示
unity
淡海水1 天前
【节点】[Houndstooth节点]原理解析与实际应用
unity·游戏引擎·shadergraph·图形·houndstooth
微:xsooop2 天前
iOS上架被拒4.3(a) 10次到过审历程
flutter·unity·ios·uniapp
DoomGT2 天前
Physics Simulation - Hit Event的触发机制
ue5·游戏引擎·虚幻·虚幻引擎·unreal engine
jtymyxmz2 天前
《Unity Shader》14.1 卡通风格的渲染
unity·游戏引擎
天人合一peng2 天前
unity获得和修改button的text(TMP)
java·前端·unity
dzj20213 天前
Unity中使用LLMUnity遇到的问题(三)——如何配置和使用知识库
unity·llmunity·知识库大模型
Clank的游戏栈3 天前
Unity自动化美术资源校验工具(模型/材质规范检测)技术详解
unity·自动化·材质