基于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。
完成。