踩坑实录
关于判断鼠标指针是否位于UI界面上
无效做法
首先给出已经失效无用的写法,注意,不要用下面的代码!
Check代码返回值就是当指针在UI层物体上时(内置UI层为第五层)返回false,否则返回True.
但经过实验,并无效果.
public bool Check()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
LayerMask layerMask = (1 << 5);
RaycastHit hitInfo;
if(Physics.Raycast(ray,out hitInfo,Mathf.Infinity,layerMask))
{
return false;
}
return true;
}
Physics.Raycast发送的射线并不能捕获到UI层物体.
正确做法
public bool Check()
{
if (EventSystem.current.IsPointerOverGameObject())
return false;
return true;
}
EventSystem.current.IsPointerOverGameObject()这个函数只会响应UI层的物体,用来判断指针是否位于UI界面上.
将类指向null
在写快捷栏使用消耗品时遇到了这样一个问题.
我对快捷栏中消耗品的逻辑时,判断数量是否为0,如果为0,将快捷栏对应的类设置为null,我想通过这样达到一个当消耗品使用完清空快捷栏数据的效果.
可是遇到了一个问题,当我重新捡到该物体时,快捷栏中的类的值竟然变化了(我没有做任何赋值操作).
那么难道设置为null是没有用的吗?
null在内存中又是怎样一种形式呢?
经查阅:
In C#, all objects are garbage collected, you can't "delete" them. When the
last reference to a given object falls out of scope, the object is liable to
collection. You can certainly null as many references as you can find, but
the object will remain alive as long as *any* reference still holds that
object.
C#的回收机制:就算指明为null,但如果其他类仍存在对这个内存的引用,引用依然存在.
也就是说我这个设为null并没有什么用,我需要采取别的方式,解决方法见下文的类的赋值.(只要声明新的内存即可,旧的失去引用的内存会被GC回收,关于GC的详细介绍可以去看C#的文档
文档传送门
类的赋值
比如Bag类有两个变量a,b;
1.表明a,b共享同一份内存,对他们中的任意一个赋值均会同时将改动作用到a,b上.
a=b;
a=c;
//此时a和b均指向c的内存地址
2.声明新内存不影响其他指向同一地址的引用型变量
a=new Bag();
这样就可以让a指向新的内存地址,b依然是原来的地址.这样a,b两个就可以脱离绑定了.
更新内容
重制版岩石怪
- 技能为:投掷石头,被打到会造成伤害并破碎,未击中玩家则不会破碎.
- 没有破碎的石头可以使用普通攻击击出,碰到敌人则破碎并造成伤害.
红史莱姆增加滚动技能
- 按指定方向快速滚动,对途径玩家造成伤害.
白史莱姆增加歌唱技能
- 唱歌使周围的怪物恢复血量.
消耗品
- 回血药剂
背包拖拽物品
- 背包中的物品可以拖拽来移动位置
快捷栏
- 支持背包中的消耗品拖拽到快捷栏中
- 玩家可以通过12345快捷使用消耗品
- 消耗品使用有冷却时间
装备系统
- 支持在背包中双击替换装备
- 支持拖拽到装备槽中替换装备
- 装备会引起属性变化
- 目前有六个装备槽:头盔,盔甲,靴子,武器,饰品,盾牌.
增加回血机制
显示方式为绿色的"+数值"
小地图显示玩家图标和怪物图标
玩家为蓝色箭头,红色为怪物图标
部分更新截图展示
白史莱姆歌唱
红史莱姆在泥巴中固定角度滚动向我冲来
石头人投掷石头
穿上了头盔
更换了头盔
使用了血瓶
优化
1.打开UI(技能,背包,属性)界面时,游戏暂停,关掉后恢复.