LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
楼主: xiaoyao1

[综合] 求教一个奇怪的问题!

[复制链接]
 楼主| 发表于 2024-8-26 10:01:41 | 显示全部楼层
blxyz521 发表于 2024-8-26 12:02 AM
初始化和加状态的不在一个脚本里,me是局部变量,肯定报空值错误。

if aabbcc and me.hp then BeeRun(" ...

这个是完整的初始化,放在魔蜂的第一个脚本里。
[Lua] 纯文本查看 复制代码
------------初始化----
local myUnit = {}
function myUnit:New(unit)
    local s = {}
   
    setmetatable(s,self)
    self.__index = self
   
    s.name = GetUnitName(unit)
    s.lv = UnitLevel(unit)
    s.hp = UnitHealth(unit)
    s.maxHp = UnitHealthMax(unit)
    s.mp = UnitMana(unit)
    s.maxMp = UnitManaMax(unit)
    s.php = (s.hp / s.maxHp)*100
    s.pmp = (s.mp / (s.maxMp > 0 and s.maxMp or 1)) * 100
    s.Skill = {}
    return s   
end
local Tbl = BeeUnitBuffList("target")
local buff = BeeUnitBuffList("player")
local me = myUnit:New("player")
local tar = myUnit:New("target")

local boss = BeeUnitClassification("target","worldboss") ---判断boss
local HQTime = BeePlayerBuffTime("荷枪实弹")

local bysc = "圣盾术,保护之手,寒冰屏障,威慑,消散,致盲,旋风,暗影斗篷"
local NeedBreak = "愤怒,星火术,火球术,奥术冲击,奥术飞弹,闪电箭,生命吸取,恐惧,圣光术,快速治疗,强效治疗术,神圣新星,治疗之触,愈合,治疗波,滋养,苦修,变形术,寒冰箭,心灵震爆,混乱之箭,治疗链,烧尽,旋风,根须缠绕"
local bykj = "激怒,狂暴"
local xyqs = "圣盾术,保护之手,寒冰屏障"
local LRZD = BeeUnitAffectingCombat()
local TarZD = BeeUnitAffectingCombat("target")
function update_var(var,new_var)
    var.value = new_var
end

local me = me or myUnit:New("player")
local tar = tar or myUnit:New("target")
update_var(me,myUnit:New("player"))
update_var(tar,myUnit:New("target"))
这是在初始化下面的保命脚本中的一句
[Lua] 纯文本查看 复制代码
if LRZD and me.hp<50 and BeeSpellCoolDown("假死")==0 and BeeSpellCD("威慑")>0 and BeePlayerBuffTime("威慑")<1 and BeeIsRun("假死") then
    BeeRun("/cast 假死");BeeRun("/StopAttack()")
end

这句话是不会报错的,LRZD在初始化里有赋值,但如果把LRZD去掉,那就会报错。
函数update_var你说没看明白,可后面的作用你说的很清楚了,大佬你是真懂。local me = me or myUnit:New("player"),这句话让有me对象就用,不再新建对象,然后update_var用来更新成员属性,这样是不是提高了内存的使用效率,不造成不断回收对象或者内存碎片化。这都是大佬vshrd教的,我是一边学一边写一边悟,利用掌握的那么点知识尽量完善(大佬一点评,马上想如何改进,还能略微动动手,我觉得我也不容易)。可大佬所说泛型for没写完,这个不太清楚(不懂),以及其他问题,也请大佬多指教。
还有一个就是对象me里的属性值,在写的时候其实也觉得有些属性是没有必要每帧更新的,大佬说的那些都有同感,但因是初写,把想到的属性先搞进去以便学习实践,写那么多也觉得这方法牛啊。
综上,我觉得这个奇怪的问题还是没有一个很好的答案


回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-26 10:03:44 | 显示全部楼层
vshrd 发表于 2024-8-25 11:15 PM
哦 意思你代码分段了?那确实还是生命周期的问题

在if后面加个其他条件,生命周期就延过来了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-26 10:07:00 | 显示全部楼层
lbabey 发表于 2024-8-26 09:33 AM
大佬说的都对呀。
我那个也只是强行用了面向的方法
没有更新数据,只会建立很多实例

大佬同学,我就是抄你的作业,在大佬vshrd的点评下,修改了下更新语句,加了个更新函数,但不是太确切清楚有没有达到目的。把脚本跑起来,经观察,似乎是可以的。
回复 支持 反对

使用道具 举报

发表于 2024-8-26 10:14:24 | 显示全部楼层
xiaoyao1 发表于 2024-8-26 10:01 AM
这个是完整的初始化,放在魔蜂的第一个脚本里。
[mw_shl_code=lua,true]------------初始化----
local  ...

但有一个问题你没想到的就是,
你新实例化了一个对象
这里同样会开辟内存- -

当然这些都不重要
初学者阶段其实不强求理解这些.
只是能理解最好
如果不能理解的话,所有知识的植入其实都只为一个目的
就是在内心中种下一颗种子.让你有一个初步的体系印象

这样等以后你学习人家的代码时.
你有体系印象你就会明白为什么要这么写,融会贯通之下.种子就会慢慢发芽最后成长为自己的编程习惯
而没有这颗种子和体系印象的话,别人的代码对你来说没办法理解,你只能当作这是一种固定格式
就像你们现在搬的我的这个me一样.
回复 支持 反对

使用道具 举报

发表于 2024-8-26 10:15:54 | 显示全部楼层
xiaoyao1 发表于 2024-8-26 10:03 AM
在if后面加个其他条件,生命周期就延过来了?

我会近两天详细讲下什么叫栈
到时你就明白了
local 局部变量他们的作用域,生命周期到底是怎么算的
回复 支持 反对

使用道具 举报

发表于 2024-8-26 10:19:28 | 显示全部楼层
xiaoyao1 发表于 2024-8-26 10:03 AM
在if后面加个其他条件,生命周期就延过来了?

你打印看看 就知道了
local LRZD = BeeUnitAffectingCombat("player")
当然这个不写player默认就是
战斗状态应该是1,否则是nil
你放另一个脚本里
你看 打印出来是什么
回复 支持 反对

使用道具 举报

发表于 2024-8-26 10:36:01 | 显示全部楼层
xiaoyao1 发表于 2024-8-26 10:01 AM
这个是完整的初始化,放在魔蜂的第一个脚本里。
[mw_shl_code=lua,true]------------初始化----
local  ...

就像大佬说的
你这样还是新建了一个实例
正确得应该是
在另一个脚本里
--调用更新
me:Update()
--打印
print(me)
回复 支持 反对

使用道具 举报

发表于 2024-8-26 11:07:22 | 显示全部楼层
本帖最后由 blxyz521 于 2024-8-26 11:19 AM 编辑
xiaoyao1 发表于 2024-8-26 10:01 AM
这个是完整的初始化,放在魔蜂的第一个脚本里。
[mw_shl_code=lua,true]------------初始化----
local  ...

奇怪的问题一点都不奇怪,虽然LRZD在初始化里有赋值,但是初始化里面的也是局部变量,在保命脚本里面他就是一个没有初始化的全局变量,实际还是个空值,你可以再前面打印出来看看,然后给他随便赋值,像下面一样,还是一样要报错的。
print(LRZD)
LRZD=1
if LRZD and me.hp<50 and BeeSpellCoolDown("假死")==0 and BeeSpellCD("威慑")>0 and BeePlayerBuffTime("威慑")<1 and BeeIsRun("假死") then

另外,就算把初始化脚本里面的LRZD改成全局变量,但是LRZD=BeeUnitAffectingCombat(),所以当你脱战的时候是不会报错的,但是在战斗中还是要报me是空值的错误。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-26 14:36:03 | 显示全部楼层
blxyz521 发表于 2024-8-26 11:07 AM
奇怪的问题一点都不奇怪,虽然LRZD在初始化里有赋值,但是初始化里面的也是局部变量,在保命脚本里面他就 ...

看到最后一段,我知道大佬说的情况是不会出现的,因为这已经是实装可运行的,已经发在论坛了。[综合] 申请进阶,把生存猎发出来,边申请边赚伸手费!(适用434)。虽然如此,我还是老老实实的去print(LRZD),结果不出意料,战斗是1,没战斗是nil,语句是按照预期运行的。
在整个生存猎的脚本中,运用me.hp这样不仅只是一处,战斗中如果这类不能正常运行,那这脚本就无法可用。所以,if me.hp不能运行,if LRZD and me.hp能正常运行,这奇怪的问题仍然存在。

回复 支持 反对

使用道具 举报

发表于 2024-8-26 14:43:11 | 显示全部楼层
xiaoyao1 发表于 2024-8-26 02:36 PM
看到最后一段,我知道大佬说的情况是不会出现的,因为这已经是实装可运行的,已经发在论坛了。[综合] 申 ...

你可以养成一个习惯
你那个报错很明显是用if去判断了nil值
那么直接print(me.hp)看看是成员nil了
还是说print(me)看看是不是对象nil了

再去结合我新发那个帖子
把生命周期关系捋一下,就知道问题了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

小黑屋|手机版|Archiver|LUACN论坛

GMT+8, 2025-5-2 02:32 AM , Processed in 0.055238 second(s), 29 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表