基于PF规则的CRPG制作尝试(二)添加属性并实现物体的显示与隐藏

基于PF规则的CRPG制作尝试(二)添加属性并实现物体的显示与隐藏

一、为object添加属性

用如下方法计算属性调整值的时候
在这里插入图片描述
出现了以下报错:
在这里插入图片描述
不是很清楚具体原因,但把属性值静态字段的话又担心会出现别的问题(还是基础太薄弱了),于是只好把调整值的计算在后面新开了一个public AbilityModifiers。
结果就是无法在静止状态下看到具体数值,只有调制的时候才会显示。

二、实现物体的显示与隐藏

做属性算是把今天的任务完成了,于是剩下的时间就用来完善昨天自己不太满意的部分。
昨天将拔剑战斗之类的动画导入进了模型,但是模型想要持剑就需要把剑固定在角色的右手上,这会让很多姿势变得非常奇怪,比如一个手上粘着剑的人伸手到背后去拔剑,想来想去也没有太好的办法,所以决定先不显示剑,在伸手拔剑的时候再显示出剑这样子。
其实还是如果能有个虚空成剑的动画比较好,但是一时也不知道该怎么做,网上冲浪看了一下,这种淡入淡出的变化是对模型的shader有要求的,可是我是用MMD4Mecanim导入的MMD的PMX格式的模型,在这中间本就有一个MMD4Mecanim将PMX转化为FBX的过程,这导致了我的模型的shader是这样的:
在这里插入图片描述
我实在也没学过shader,也不敢乱改,只能退而求其次寻找能让模型消失出现的办法。
上网寻找了一段时间后,发现目前有几种方法能够实现我想要的效果

1.设置Renderer状态

在游戏的开发中,全部可以被渲染的物体都包括有一个Renderer组件。使用它可以将物体渲染到屏幕上,那么假设禁用了这一组件的话,自然也就实现了物体的隐藏。

2.设置Active

gameObject.SetActive(true);//显示物体
gameObject.SetActive(false);//隐藏物体
尝试之后发现只能隐藏模型,隐藏之后就无法再次出现了,网上也众说纷纭,自己debug试了试觉得可能是因为false了之后物体就认为已经消失了,这导致不会再执行true的操作。
所以最后只能尝试第三种

3设置Layer

主要思路是先将剑新建一个layer(sword)放入,然后将camera的Culling Mask取消sword层的勾选,通过代码实现在某个时刻将剑的layer从sword层转换到别的能在camera显示的层(Delta)。
具体的代码如下:

    public WeaponData wdata;
    // Start is called before the first frame update
    void ChangeLayer(Transform trans, string targetLayer)
    {
        if (LayerMask.NameToLayer(targetLayer) == -1)
        {
            Debug.Log("Layer中不存在,请手动添加LayerName");
            return;
        }
        //遍历更改所有子物体layer
        trans.gameObject.layer = LayerMask.NameToLayer(targetLayer);
        foreach (Transform child in trans)
        {
            ChangeLayer(child, targetLayer);
            Debug.Log(child.name + "子对象Layer更改成功!");
        }
    }
    void Showsword()
    {
        ChangeLayer(gameObject.transform, "Delta");
    }

我选择在德尔塔手放在身后摸剑的时候将剑显示出来,为此在摸剑的动作中加入了事件Showsword。

在这里插入图片描述
完成。

写一个简易 CRPG 是一项很复杂的任务,需要设计游戏世界、角色、道具、怪物等众多要素,并编写相关的代码来实现游戏逻辑。下面是一个简单的示例,只包含了一些基本的游戏元素和逻辑: ```c++ #include <iostream> #include <cstdlib> #include <ctime> using namespace std; // 定义角色结构体 struct Player { string name; int hp; int mp; int level; int exp; int gold; }; // 定义怪物结构体 struct Monster { string name; int hp; int attack; int defense; int exp; int gold; }; // 初始化角色 void initPlayer(Player& player) { player.name = "Hero"; player.hp = 100; player.mp = 50; player.level = 1; player.exp = 0; player.gold = 0; } // 显示角色状态 void showPlayer(Player& player) { cout << "Name: " << player.name << endl; cout << "Level: " << player.level << endl; cout << "HP: " << player.hp << endl; cout << "MP: " << player.mp << endl; cout << "Exp: " << player.exp << endl; cout << "Gold: " << player.gold << endl; } // 初始化怪物 void initMonster(Monster& monster) { monster.name = "Slime"; monster.hp = 50; monster.attack = 10; monster.defense = 5; monster.exp = 20; monster.gold = 10; } // 显示怪物状态 void showMonster(Monster& monster) { cout << "Name: " << monster.name << endl; cout << "HP: " << monster.hp << endl; cout << "Attack: " << monster.attack << endl; cout << "Defense: " << monster.defense << endl; cout << "Exp: " << monster.exp << endl; cout << "Gold: " << monster.gold << endl; } // 角色攻击怪物 void playerAttack(Player& player, Monster& monster) { int damage = player.level * 10 + rand() % 10 - monster.defense; if (damage < 0) damage = 0; monster.hp -= damage; cout << player.name << " deals " << damage << " damage to " << monster.name << endl; if (monster.hp <= 0) { cout << monster.name << " is defeated!" << endl; player.exp += monster.exp; player.gold += monster.gold; if (player.exp >= player.level * 100) { player.exp -= player.level * 100; player.level++; cout << player.name << " levels up!" << endl; } initMonster(monster); } } // 怪物攻击角色 void monsterAttack(Player& player, Monster& monster) { int damage = monster.attack - player.level * 2; if (damage < 0) damage = 0; player.hp -= damage; cout << monster.name << " deals " << damage << " damage to " << player.name << endl; if (player.hp <= 0) { cout << player.name << " is defeated!" << endl; exit(0); } } // 主函数 int main() { srand(time(NULL)); Player player; Monster monster; initPlayer(player); initMonster(monster); while (true) { showPlayer(player); showMonster(monster); cout << "1. Attack" << endl; cout << "2. Run away" << endl; int choice; cin >> choice; if (choice == 1) { playerAttack(player, monster); monsterAttack(player, monster); } else if (choice == 2) { cout << "You run away!" << endl; initMonster(monster); } } return 0; } ``` 这个简易 CRPG 的逻辑很简单,玩家需要与怪物战斗,获得经验和金币,提升自己的等级。玩家每次攻击怪物或者被怪物攻击时,都会有一定的随机因素,使得游戏更加有趣。这只是一个简单的示例,实际上一个完整的 CRPG 需要更加复杂的设计和实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值