源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

193 行
5.7 KiB

cc = cc or {}
cc.CC_INVALID_INDEX = -1
cc.ActionManager = cc.ActionManager or {}
function cc.ActionManager:init()
cc.ActionManager.Instance = self
self._targets = {}
setmetatable(self._targets, {__mode = "k"})
self._currentTarget = nil
self._currentTargetSalvaged = false
Runner.Instance:AddRunObj(self, 1)
end
function cc.ActionManager:getInstance()
if cc.ActionManager.Instance == nil then
cc.ActionManager.Instance = self
self:init()
end
return cc.ActionManager.Instance
end
function cc.ActionManager:addAction(action, target, paused)
if action == nil then
print("Cat_Error:ActionManager.lua [addAction] action is nil", debug.traceback())
return
end
assert(target ~= false, "你传进来的transform是false 是不是没加载完啊")
if target == nil then
print("Cat_Error:ActionManager.lua [addAction] target is nil", debug.traceback())
return
end
local element = self._targets[target]
if not element then
element = {actions = {} ,target = target, actionIndex = 0, currentActionSalvaged = false, paused=paused}
self._targets[target] = element
end
if self:isArrayContainsObject(element.actions, action) then
print("Cat_Error:ActionManager.lua [addAction] action already be added!")
end
table.insert(element.actions, action)
action:startWithTarget(target);
end
function cc.ActionManager:removeAction(action)
if action == nil then return end
local target = action:getOriginalTarget()
local element = self._targets[target]
if element then
local i = self:arrayGetIndexOfObject(element.actions, action)
if i ~= cc.CC_INVALID_INDEX then
self:removeActionAtIndex(i, element);
end
else
print("Cat:ActionManager.lua [removeAction] Target not found")
end
end
function cc.ActionManager:isTargetInAction(target)
return self:getNumberOfRunningActionsInTarget(target)>0
end
function cc.ActionManager:getNumberOfRunningActionsInTarget(target)
local element = self._targets[target]
if element then
return element.actions and #(element.actions) or 0
end
return 0
end
function cc.ActionManager:Update(total_time, dt)
-- if G_DEBUG_STOP_ACTION then
-- return
-- end
-- print('Cat:ActionManager.lua[86] start update', next(self._targets))
for k,v in pairs(self._targets) do
--unity组件释放了的话会变成null
if tostring(k) == "null" then
self._targets[k] = nil
else
self._currentTarget = v
self._currentTargetSalvaged = false
if not self._currentTarget.paused then
self._currentTarget.actionIndex = 1
while self._currentTarget.actionIndex <= #(self._currentTarget.actions) do
self._currentTarget.currentAction = self._currentTarget.actions[self._currentTarget.actionIndex]
repeat
if self._currentTarget.currentAction == nil then
self._currentTarget.actionIndex = self._currentTarget.actionIndex + 1
break
end
self._currentTarget.currentActionSalvaged = false
self._currentTarget.currentAction:step(dt)
if self._currentTarget.currentActionSalvaged then
self._currentTarget.currentAction = nil
elseif self._currentTarget.currentAction:isDone() then
self._currentTarget.currentAction:stop()
local action = self._currentTarget.currentAction
self._currentTarget.currentAction = nil
self:removeAction(action)
end
self._currentTarget.currentAction = nil
self._currentTarget.actionIndex = self._currentTarget.actionIndex + 1
until true
end
end
-- only delete currentTarget if no actions were scheduled during the cycle (issue #481)
if self._currentTargetSalvaged and #(self._currentTarget.actions) == 0 then
self._targets[k] = nil
end
end
end
self._currentTarget = nil
end
function cc.ActionManager:arrayRemoveObjectAtIndex(actions, index,releaseObj)
if releaseObj and actions[index] then
actions[index] = nil
end
table.remove(actions,index)
end
function cc.ActionManager:isArrayContainsObject(actions, action)
for i,v in ipairs(actions) do
if action == v then
return true
end
end
return false
end
function cc.ActionManager:removeActionAtIndex(index, element)
local action = element.actions[index]
if action == element.currentAction and not element.currentActionSalvaged then
element.currentActionSalvaged = true;
end
self:arrayRemoveObjectAtIndex(element.actions, index, true)
if element.actionIndex > index then
element.actionIndex = element.actionIndex - 1
end
if #(element.actions) == 0 then
if self._currentTarget == element then
self._currentTargetSalvaged = true
end
end
end
function cc.ActionManager:arrayGetIndexOfObject(actions, action)
for i,v in ipairs(actions) do
if action == v then
return i
end
end
return cc.CC_INVALID_INDEX
end
function cc.ActionManager:removeAllActions()
for k,v in pairs(self._targets) do
self:removeAllActionsFromTarget(v.target)
end
self._targets = {}
setmetatable(self._targets, {__mode = "k"})
end
function cc.ActionManager:removeAllActionsFromTarget(target)
if target == nil then
return
end
local element = self._targets[target]
if element then
if self:isArrayContainsObject(element.actions, element.currentAction) and (not element.currentActionSalvaged) then
element.currentActionSalvaged = true
end
element.actions = {}
if self._currentTarget == element then
self._currentTargetSalvaged = true
else
self._targets[target] = nil
end
end
end