Sui 动态 NFT 增强游戏性

下面是两个简短的游戏预开发原型,展示了可变型、表现力强的 NFT 所带来的速度、可扩展性和丰富的交互。

Sui 动态 NFT 增强游戏性

这里有两个简短的游戏预开发原型,展示了可变型、有表现力的 NFT 所带来的速度、可扩展性和丰富的交互。第一个原型Sui Monstar 现在就可以玩。

Sui 和游戏

游戏作为首批快速采用 web3 的垂直领域之一,是一个热门话题。然而,可以说现有的 web3 游戏与其说是游戏,不如说是投资,用户保留率受市场条件而非游戏本身的影响。

那么,现有的第三版网页游戏还缺少什么呢?首先,一款成功的网页3游戏必须提供与网页1或网页2游戏完全不同的体验。要想真正大放异彩,Web3 游戏必须以一种有意义的方式利用完全链上、动态和可组合的数字资产以及可验证所有权的优势。这些功能可以为令人难以置信和富有想象力的游戏和生态系统提供动力,创造巨大的价值和参与度。

其次,优秀的游戏需要经验丰富的游戏开发者和构建者--他们知道如何构建游戏,如何创造有趣的、以用户为中心的体验。有大量人才渴望在 web3 平台上开发游戏,但平台的局限性和学习新编程语言的痛苦阻碍了他们的创造力。

通过Sui ,我们认为游戏开发者不应该受到平台性能或费用的限制,他们应该能够创造出他们想象中的任何体验。重要的是,开发优秀的游戏不应要求游戏开发者也是编写智能合约的专家。相反,他们应该专注于自己擅长的领域,为玩家打造炫酷的游戏。

智能合约可选

Move我们的游戏开发工具包简直棒极了:它安全、表现力强且不受重入性的影响;但在Sui 上构建有意义的体验并不需要移动方面的专业知识。为了让开发者和创作者更轻松地开始将Sui 用于游戏,我们将发布游戏 SDK,以解决常见用例和游戏资产相关功能。

我们是如何做到的

这些原型由游戏开发工作室 Geniteam 制作,使用了 Unity SDK 和Sui 应用程序接口.

参与此次合作的 Geniteam 开发人员既不是智能合约开发人员,也不是Move 开发人员。根据他们的意见,我们创建了一个数据模型,并共享了简单的 API。有了这些应用程序接口,Geniteam 就能铸造可变的完全链上 NFT,拥有其他链上资产,并可自由转移到其他应用程序。

这一概念验证构建旨在展示通过Sui 为游戏开发者解锁的功能。我们期待着在未来几个月中看到游戏社区的创意人才们开发出更多的功能。每修复一个错误,我们就能深入了解游戏开发者对 SDK 的需求。Sui 致力于为具有不同程度智能合约专业知识的各级开发者提供 SDK。

"使用Sui SDK 的过程非常顺利。这些 SDK 易于理解和实施。Mysten Labs 的团队毫不回避我们对 SDK 实施的反馈意见。他们与我们团队的协同合作无可挑剔,这使得 API 调用非常迅速,从而将加载时间降到了最低。- Geniteam

以下是我们分享的应用程序接口 Geniteam 的示例,以及用于创建和更新怪物(原型中命名为 MonStars)的智能合约。

APIMove 调用 - 创建怪物

POST /call,带正文:

{
"sender": "{{owner}}",
"packageObjectId": "0x2",
"module": "Geniteam",
"function": "create_monster",
"args": [
"0x{{player_id}}",
"0x{{farm_id}}",
"0x{{pet_monsters}}",
{{monster_name}},
{{monster_img_index}},
{{breed}},
{{monster_affinity}},
{{monster_description}}
],
"gasObjectId": "{{gas_object_id}}",
"gasBudget": 2000
}

APIMove 调用 - 更新怪物

POST /call,带正文:

{
"sender": "{{owner}}",
"packageObjectId": "0x2",
"module": "Geniteam",
"function": "update_monster_stats",
"args": [
"0x{{player_id}}",
"0x{{farm_id}}",
"0x{{pet_monsters}}",
"0x{{monster_id}}",
{{monster_level}},
{{hunger_level}},
{{affection_level}},
{{buddy_level}}
],
"gasObjectId": "{{gas_object_id}}",
"gasBudget": 2000
}

APIMove 调用 - 读取怪物数据

GET /object_info?objectId={{monster_id}}

智能合约:创建怪物

struct Monster has key, store {
        id: VersionedID,
        monster_name: String,
        monster_img_index: u64,
        breed: u8,
        monster_affinity: u8,
        monster_description: String,
        monster_level: u64,
        monster_xp: u64,
        hunger_level: u64,
        affection_level: u64,
        buddy_level: u8,

        // ID of the applied cosmetic at this slot
        applied_monster_cosmetic_0_id: Option<ID>,
        // ID of the applied cosmetic at this slot
        applied_monster_cosmetic_1_id: Option<ID>,    
    }

.. .

// Create a Monster and add it to the Farm's collection of Monsters
    public fun create_monster(_player: &mut Player,
                              farm: &mut Farm,
                              pet_monsters_c: &mut Collection::Collection,
                              monster_name: vector<u8>,
                              monster_img_index: u64,
                              breed: u8,
                              monster_affinity: u8,
                              monster_description: vector<u8>,
                              ctx: &mut TxContext
    ) {

        let monster = create_monster_(
            monster_name,
            monster_img_index,
            breed,
            monster_affinity,
            monster_description,
            ctx
        );

        // Check if this is the right collection
        assert!(*&farm.pet_monsters_id == *ID::id(pet_monsters_c), EMONSTER_COLLECTION_NOT_OWNED_BY_FARM);


        // Add it to the collection

.. .

Collection::add(pet_monsters_c, monster);
    }

    // Creates a basic Monster object
    public fun create_monster_(
        monster_name: vector<u8>,
        monster_img_index: u64,
        breed: u8,
        monster_affinity: u8,
        monster_description: vector<u8>,
        ctx: &mut TxContext
    ): Monster {

        Monster {
            id: TxContext::new_id(ctx),
            monster_name: ASCII::string(monster_name),
            monster_img_index,
            breed,
            monster_affinity,
            monster_description: ASCII::string(monster_description),
            monster_level: 0,
            monster_xp: 0,
            hunger_level: 0,
            affection_level: 0,
            buddy_level: 0,
            applied_monster_cosmetic_0_id: Option::none(),
            applied_monster_cosmetic_1_id: Option::none(),
        }
    }

智能合约:更新怪物

// Update the attributes of a monster
    public fun update_monster_stats(
        _player: &mut Player,
        _farm: &mut Farm,
        _pet_monsters: &mut Collection::Collection,
        self: &mut Monster,
        monster_level: u64,
        hunger_level: u64,
        affection_level: u64,
        buddy_level: u8,
        _ctx: &mut TxContext
    ) {
        self.monster_level = monster_level;
        self.hunger_level = hunger_level;
        self.affection_level = affection_level;
        self.buddy_level = buddy_level;
    }

原型 1Sui Monstar

第一个原型是Sui Monstar,这是一款宠物模拟游戏。

游戏玩法

  • 玩耍、喂食和装扮您的猫狗朋友。
  • 使用亲和符文进化宠物!
  • 装饰你的农场
  • 通过游戏和互动提高你的农场和宠物等级。

在Sui Monstar 中,您可以捕捉可爱的 monstars,看着它们在您的喂养和互动下离您越来越近。这些单星、您的农场和配件都是链上的 NFT。在游戏过程中,健康、友好度和配件等属性都会实时更新。

elemental-runes-monstar.png

为你的魔星装备元素符文,让你的 NFT 因更新的属性而进化

这还不是全部,当你的魔星变得更强大时,你可以用它们来帮助你战斗......在下一个原型中>>>

即将推出的《原型 2》Sui Battler

很快,我们将推出Sui Battler,让您可爱的单星变身勇士!

游戏玩法

  • 与一波又一波的敌人作战,获取经验和能量。
  • 在Sui Monstar 中获得宠物的帮助。
  • 在Sui Monstar 中进化您的宠物,解锁特殊的战斗能力。
  • 你的单星记录了你在链上的战斗历史!
evolve-monstar.png

进化你的魔星,解锁特殊能力

为什么这很重要

  • 可变 NFT 意味着更丰富、更有创意的游戏玩法。为了 "修改" NFT,不再需要复杂的变通方法或烧毁 NFT,也不会丢失所有数据和历史记录。
  • 以可用性为重点的应用程序接口使在Sui 上构建变得简单。
  • 无与伦比的可扩展性和即时结算意味着,资产状态、余额和所有权的更改可与游戏同时即时进行。不再有延迟或变通方法。
  • 创意无限。创作者可以在各种应用程序和游戏中自由使用他们的资产。
  • 具有丰富历史的全链上可组合 NFT 使下一代游戏经济成为可能。