Skip to content

Latest commit

 

History

History
322 lines (285 loc) · 11.1 KB

prefab.md

File metadata and controls

322 lines (285 loc) · 11.1 KB

定义

prefab 预制体,饥荒游戏里所有的东西都是prefab(比如人物,花,鸟,鱼,树等等)

先看看Prefab()函数的定义

Prefab = Class( function(self, name, fn, assets, deps, force_path_search)
    self.name = string.sub(name, string.find(name, "[^/]*$"))  --remove any legacy path on the name
    self.desc = ""
    self.fn = fn
    self.assets = assets or {}
    self.deps = deps or {}
    self.force_path_search = force_path_search or false

    if PREFAB_SKINS[self.name] ~= nil then
		for _,prefab_skin in pairs(PREFAB_SKINS[self.name]) do
			table.insert( self.deps, prefab_skin )
		end
    end
end)
  • name 预制体名,在控制台里通过 c_give() 生成物品的时候要传的就是这个名字
  • fn 初始化函数,在里面定义各种属性,方法等
  • assets 材质,预制体用到的动画、贴图、音乐等
  • deps 直接传prefabs变量即可,在main.lua里klei给定义好了这个变量,就是为了兼容乱七八糟的mod里的写法的prefabs = nil -- this is here so mods dont crash because one of our prefab scripts missed the local and a number of mods were erroneously abusing it
  • force_path_search 直译强制路径搜索

预制体只是一个空壳,要想让预制体有功能(比如斧头能砍树,食物能吃),就需要给它们身上添加上相应的组件,给预制体添加组件方法就是 AddComponent() 相应的移除组件就是 RemoveComponent()

这些预制体上的方法或者属性都被定义在 entityscript.lua 文件里

预制体上默认已经有的属性有如下这些

EntityScript = Class(function(self, entity)
    self.entity = entity
    self.components = {}
    self.lower_components_shadow = {}
    self.GUID = entity:GetGUID()
    self.spawntime = GetTime()
    self.persists = true
    self.inlimbo = false
    self.name = nil

    self.data = nil
    self.listeners = nil
    self.updatecomponents = nil
    self.actioncomponents = {}
    self.inherentactions = nil
    self.inherentsceneaction = nil
    self.inherentscenealtaction = nil
    self.event_listeners = nil
    self.event_listening = nil
    self.worldstatewatching = nil
    self.pendingtasks = nil
    self.children = nil

    self.actionreplica = nil
    self.replica = Replica(self)
end)

方法有下面这些

  • GetSaveRecord()
  • Hide() 隐藏
  • Show() 显示
  • IsInLimbo()
  • ForceOutOfLimbo()
  • RemoveFromScene() 从屏幕中移除
  • ReturnToScene() 回到屏幕中
  • __tostring()
  • AddInherentAction() 添加固有动作
  • RemoveInherentAction() 移除固有运用
  • GetTimeAlive() 获取存在时间
  • StartUpdatingComponent() 开始更新组件
  • StopUpdatingComponent() 停止更新组件
  • StopUpdatingComponent_Deferred() 延时停止更新组件
  • StartWallUpdatingComponent()
  • StopWallUpdatingComponent()
  • GetComponentName() 获取组件名
  • AddTag() 添加标签
  • RemoveTag() 移除标签
  • HasTag() 判断是否有标签
  • AddComponent() 添加组件
  • RemoveComponent() 移除组件
  • GetBasicDisplayName() 获取基础名
  • GetAdjectivedName() 获取形容名
  • GetDisplayName() 获取显示名
  • GetIsWet() 判断是否是潮湿状态
  • GetSkinBuild() 获取皮肤
  • GetSkinName() 获取皮肤名
  • SetPrefabName() 设置预制体名
  • SetPrefabNameOverride()
  • SetDeployExtraSpacing() 设置放置间隔
  • SetTerraformExtraSpacing() 设置地形间隔
  • SetGroundTargetBlockerRadius() 设置地面目标不可放置间隔
  • SpawnChild()
  • RemoveChild()
  • AddChild()
  • GetBrainString() 获取大脑名
  • GetDebugString()
  • KillTasks() 杀掉所有任务
  • StartThread() 开始线程
  • RunScript() 运行脚本
  • RestartBrain() 重启大脑
  • StopBrain() 停止大脑
  • SetBrain() 设置大脑(比如一些怪物的行为)
  • SetStateGraph() 设置状态图
  • ClearStateGraph() 清除状态图
  • ListenForEvent() 监听事件
  • RemoveListener() 移除事件
  • RemoveEventCallback() 移除事件回调
  • RemoveAllEventCallbacks() 移除所有事件回调
  • WatchWorldState() 观察世界状态,常用于判断世界季节等
  • StopWatchingWorldState() 停止观察世界状态
  • StopAllWatchingWorldStates() 停止观察所有世界状态
  • PushEvent() 推送事件
  • SetPhysicsRadiusOverride()
  • GetPhysicsRadius()
  • GetPosition() 获取世界坐标
  • GetRotation() 获取旋转
  • GetAngleToPoint()
  • GetPositionAdjacentTo() 获取相邻于xx的坐标
  • ForceFacePoint()
  • FacePoint()
  • GetDistanceSqToInst()
  • IsNear() 判断是否在某个预制体附近
  • GetDistanceSqToPoint()
  • IsNearPlayer() 判断是否在玩家附近(这个应该是在科学仪器上有用到)
  • GetNearestPlayer() 获取周围玩家
  • GetDistanceSqToClosestPlayer() 获取距离最近玩家的距离
  • FaceAwayFromPoint()
  • IsAsleep() 判断是否在睡觉
  • CancelAllPendingTasks() 取消所有等待的任务
  • DoPeriodicTask() 定时任务,周期性执行
  • DoTaskInTime() 定时任务,延时执行
  • GetTaskInfo() 获取任务信息
  • TimeRemainingInTask()
  • ResumeTask() 继续任务
  • ClearBufferedAction() 清除动作
  • PreviewBufferedAction() 预览动作
  • PerformPreviewBufferedAction()
  • PushBufferedAction() 推送动作
  • PerformBufferedAction()
  • GetBufferedAction() 获取动作
  • OnBuilt() 判断是否在创建
  • Remove() 移除
  • IsValid() 判断是否有效
  • OnUsedAsItem()
  • CanDoAction() 是否可以开始动作
  • IsOnValidGround() 是否在有效的地面上
  • IsOnPassablePoint() 是否在可能的位置
  • IsOnOcean() 是否在海洋上
  • GetCurrentPlatform() 获取当前所处平台
  • GetCurrentTileType() 获取当前地皮类型
  • PutBackOnGround()
  • GetPersistData()
  • LoadPostPass()
  • SetPersistData()
  • GetAdjective()
  • SetInherentSceneAction()
  • SetInherentSceneAltAction()
  • LongUpdate()
  • SetClientSideInventoryImageOverride()
  • HasClientSideInventoryImageOverrides()
  • GetClientSideInventoryImageOverride()
  • SetClientSideInventoryImageOverrideFlag()
  • IsInLight() 是否在灯光内
  • IsLightGreaterThan()

在代码里要想生成一个预制体,可以使用 SpawnPrefab() 方法

创建

创建预制体要用 mainfunctions.lua 里的 CreateEntity() 创建,这个方法被挂在 TheSim

在案例中的添加食谱那篇里有创建预制体的例子,代码如下,贴图可以去那篇里跟着做一下

-- 加载贴图,动画
local assets = {Asset("ANIM", "anim/pidan.zip"), Asset("IMAGE", "images/pidan.tex"), Asset("ATLAS", "images/pidan.xml")}

function fn()
    local assetname = "pidan"

    local inst = CreateEntity() -- 创建实体
    inst.entity:AddTransform() -- 添加xyz形变对象
    inst.entity:AddAnimState() -- 添加动画状态

    MakeInventoryPhysics(inst)

    inst.AnimState:SetBank(assetname) -- 地上动画
    inst.AnimState:SetBuild(assetname) -- 材质包,就是anim里的zip包
    inst.AnimState:PlayAnimation("idle") -- 默认播放哪个动画

    MakeInventoryFloatable(inst)
    --------------------------------------------------------------------------
    if not TheWorld.ismastersim then
        return inst
    end
    --------------------------------------------------------------------------
    inst:AddComponent("inspectable") -- 可检查组件
    inst:AddComponent("inventoryitem") -- 物品组件

    inst.components.inventoryitem.atlasname = "images/pidan.xml" -- 在背包里的贴图

    inst:AddComponent("edible") -- 可食物组件
    inst.components.edible.foodtype = FOODTYPE.MEAT

    inst:AddComponent("perishable") -- 可腐烂的组件
    inst.components.perishable:SetPerishTime(TUNING.PERISH_SUPERSLOW)
    inst.components.perishable:StartPerishing()
    inst.components.perishable.onperishreplacement = "spoiled_food" -- 腐烂后变成腐烂食物

    inst.components.edible.hungervalue = TUNING.CALORIES_SMALL
    inst.components.edible.healthvalue = TUNING.CALORIES_TINY
    inst.components.edible.sanityvalue = TUNING.SANITY_HUGE

    inst:AddComponent("stackable") -- 可堆叠
    inst.components.stackable.maxsize = TUNING.STACK_SIZE_SMALLITEM

    MakeHauntableLaunch(inst)

    return inst
end

return Prefab("pidan", fn, assets, prefabs)

通过CreateEntity()方法生成的 inst 实例,在最开始会添加一些方法(来自龙飞教程 https://www.jianshu.com/p/261c62c26e99)

  • Transform:变换组件,控制Prefab的位置、方向、缩放等等
  • AnimState:动画组件,控制Prefab的材质(Build),动画集合(Bank)和动画播放(Animation)
  • Phiysics:物理组件,控制Prefab的物理行为,比如速度,碰撞类型等等。
  • Light:光照组件,添加该组件可使得Prefab成为一个光源。
  • Network:网络组件,添加与否决定了一个Prefab在主机上生成时,是否会被客户端“看”到。
  • MapEntity:地图实体组件,使用该组件可以为Prefab在小地图上创建一个图标。
  • SoundEmitter:声音组件,控制Prefab的声音集合和播放

创建例子中的几个方法 MakeInventoryPhysics(inst) MakeInventoryFloatable(inst) MakeHauntableLaunch(inst)

这些函数是在 standardcomponents.lua 里定义的,这些方法绝大部分都是设置物理性质的

  • DefaultIgniteFn()
  • DefaultBurnFn()
  • DefaultBurntFn()
  • DefaultExtinguishFn()
  • DefaultBurntStructureFn()
  • MakeSmallBurnable()
  • MakeMediumBurnable()
  • MakeLargeBurnable()
  • MakeSmallPropagator()
  • MakeMediumPropagator()
  • MakeLargePropagator()
  • MakeSmallBurnableCharacter()
  • MakeMediumBurnableCharacter()
  • MakeLargeBurnableCharacter()
  • MakeTinyFreezableCharacter()
  • MakeSmallFreezableCharacter()
  • MakeMediumFreezableCharacter()
  • MakeLargeFreezableCharacter()
  • MakeHugeFreezableCharacter()
  • MakeInventoryPhysics()
  • MakeProjectilePhysics()
  • MakeCharacterPhysics()
  • MakeFlyingCharacterPhysics()
  • MakeTinyFlyingCharacterPhysics()
  • MakeGiantCharacterPhysics()
  • MakeFlyingGiantCharacterPhysics()
  • MakeGhostPhysics()
  • MakeTinyGhostPhysics()
  • ChangeToGhostPhysics()
  • ChangeToCharacterPhysics()
  • ChangeToObstaclePhysics()
  • ChangeToWaterObstaclePhysics()
  • ChangeToInventoryPhysics()
  • MakeObstaclePhysics()
  • MakeWaterObstaclePhysics()
  • MakeSmallObstaclePhysics()
  • MakeHeavyObstaclePhysics()
  • MakeSmallHeavyObstaclePhysics()
  • RemovePhysicsColliders()
  • MakeNoGrowInWinter()
  • MakeSnowCoveredPristine()
  • MakeSnowCovered()
  • MakeFeedableSmallLivestockPristine()
  • MakeFeedableSmallLivestock()
  • MakeHauntable()
  • MakeHauntableLaunch()
  • MakeHauntableLaunchAndSmash()
  • MakeHauntableWork()
  • MakeHauntableWorkAndIgnite()
  • MakeHauntableFreeze()
  • MakeHauntableIgnite()
  • MakeHauntableLaunchAndIgnite()
  • MakeHauntableChangePrefab()
  • MakeHauntableLaunchOrChangePrefab()
  • MakeHauntablePerish()
  • MakeHauntableLaunchAndPerish()
  • MakeHauntablePanic()
  • MakeHauntablePanicAndIgnite()
  • MakeHauntablePlayAnim()
  • MakeHauntableGoToState()
  • MakeHauntableGoToStateWithChanceFunction()
  • MakeHauntableDropFirstItem()
  • MakeHauntableLaunchAndDropFirstItem()
  • AddHauntableCustomReaction()
  • AddHauntableDropItemOrWork()
  • ToggleOffCharacterCollisions()
  • ToggleOnCharacterCollisions()
  • ToggleOffAllObjectCollisions()
  • ToggleOnAllObjectCollisionsAt()
  • PreventCharacterCollisionsWithPlacedObjects()
  • PreventTargetingOnAttacked()
  • AddDefaultRippleSymbols()
  • MakeInventoryFloatable()
  • MakeDeployableFertilizerPristine()
  • MakeDeployableFertilizer()