U3d插件——Swarm Object Manager分析(二)SwarmItem

本文介绍了一个用于Unity游戏开发中管理动态对象池的基类SwarmItem。该类通过控制对象的激活状态和生命周期来实现资源的有效管理和复用,特别适用于大量短暂存在的游戏元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class SwarmItem : MonoBehaviour
{
    protected STATE _state;       //用来处理是不是活动的状态        
   
    protected SwarmItemManager _swarmItemManager; //父对象的物体引用
   
    protected Transform _thisTransform;    
   
    protected int _prefabIndex;
   
    protected float _lifeSpanLeft;
   
    protected bool _debugEvents;
   
    public enum STATE
    {
        Inactive,
        Active
    }

   

    //生命值的时间   即留在场上的时间长短

    public float minimumLifeSpan = 0;
    public float maximumLifeSpan = 0;
   
    public STATE State
    {
        get
        {
            return _state;
        }
        set
        {
            // save whether the state was changed
            bool _stateChanged = (_state != value);
            
            _state = value;
            
            switch (_state)
            {
            case STATE.Inactive:
                // turn off the item
                gameObject.SetActiveRecursively(false);
                break;
                
            case STATE.Active:
                // turn on the item and reset its life span
                gameObject.SetActiveRecursively(true);
                _lifeSpanLeft = UnityEngine.Random.Range(minimumLifeSpan, maximumLifeSpan);
                break;
            }
            
            // if the state changed, call the OnStateChange method
            if (_stateChanged)
                OnStateChange();
        }
    }
   
    protected virtual void OnStateChange()

    {


    }
   
    public int PrefabIndex  //预设的标签数?
    {
        get
        {
            return _prefabIndex;
        }
    }
    
    //重要  设置SwarmItemManager 和 预设的标签   是否debug等
    public virtual void Initialize(SwarmItemManager swarmItemManager, int prefabIndex, bool debugEvents)
    {
        _swarmItemManager = swarmItemManager;
        _prefabIndex = prefabIndex;
        _debugEvents = debugEvents;
        
        _thisTransform = this.transform;
        
        State = STATE.Inactive;
    }
    
    /// <summary>
    /// This method is called by the manager after the item is moved to either the active or inactive list.
    /// It is often useful to modify an item's position, rotation, or scale here since these values will
    /// be set to Vector3.zero, Quaternion.Identity, and Vector3.one, respectively.
    /// </summary>  相当于回复之后的初始化,给子物体使用
    public virtual void OnSetParentTransform()
    {
    }
   
    public virtual void Kill()   //放回垃圾回收池
    {
        State = STATE.Inactive;
        _swarmItemManager.DeactiveItem(this);
    }
    
    /// <summary>
    /// This is called before an object is destroyed by a prune event from the manager.
    /// You should call Destroy on any objects in your inherited class that need their memory freed
    /// using an overload of this method.
    /// </summary>
    public virtual void PreDestroy()  //物体预先被销毁时调用
    {
    }
   
    public virtual void FrameUpdate()
    {
        if (_lifeSpanLeft > 0)
        {
            _lifeSpanLeft -= Time.deltaTime;
            if (_lifeSpanLeft <= 0)
            {
                Kill();
                if (_debugEvents)
                    Debug.Log("Lifespan expired for item " + name + " at frame: " + Time.frameCount);
            }
        }
    }

}

这就是这个垃圾回收的基类的item 感觉还是十分有用的...,但是貌似如果是大boss的话貌似没什么效率...



<think>嗯,用户想了解如何在Docker Swarm中加入一个Manager节点的命令。我需要先回忆一下Docker Swarm的相关知识。Swarm是Docker原生的集群管理工具,Manager节点负责集群的管理工作,比如调度服务、维护集群状态等。 首先,用户可能已经初始化了一个Swarm集群,所以第一步应该是确认如何获取加入Manager所需的令牌和命令。记得初始化Swarm后会生成两种令牌,一个是Worker的,另一个是Manager的。用户需要的是Manager的令牌。 接下来,加入Manager节点的命令应该是`docker swarm join-token manager`,运行这个命令会显示具体的加入命令,包括令牌和IP地址。用户需要在要加入的节点上执行这个命令。 不过,我需要确认命令的正确性,避免记错了参数。比如,是否真的是`docker swarm join --token <manager-token> <manager-ip>:<port>`这样的结构。端口默认是2377,所以如果没改过的话可以直接用IP加端口。 还要提醒用户,如果现有的Manager节点有多个,最好选择稳定的节点作为目标,或者考虑高可用性的配置。同时,防火墙设置可能需要开放2377端口,TCP和UDP的7946端口,以及UDP的4789端口,这些是Swarm通信所需的。 另外,用户可能需要知道如何查看当前Swarm的节点列表,可以用`docker node ls`来确认新Manager是否成功加入。这一步也很重要,确保操作成功。 还要注意,加入Manager节点需要具备足够的管理权限,可能需要sudo或者管理员权限。用户可能会遇到权限问题,所以提醒他们使用sudo或者以root用户运行命令。 最后,可能还需要解释一下Manager节点的作用,比如参与Raft一致性算法,需要奇数个Manager节点来避免脑裂问题,所以用户应该根据集群规模合理规划Manager的数量。</think>以下是在Docker Swarm中将节点加入为Manager的详细步骤: ### 步骤1:在已有Manager节点获取加入命令 ```bash # 在现有的Swarm Manager节点执行 docker swarm join-token manager ``` 执行后会显示如下格式的命令: ```bash docker swarm join --token SWMTKN-1-xxxxxx 192.168.1.100:2377 ``` ### 步骤2:在新节点执行加入命令 ```bash # 在要加入的新节点上执行上一步生成的命令 sudo docker swarm join --token SWMTKN-1-xxxxxx 192.168.1.100:2377 ``` ### 验证加入结果 ```bash # 在任意Manager节点查看节点列表 docker node ls # 输出示例(会显示新节点的MANAGER STATUS) ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS abc123 node2 Ready Active Reachable def456 node1 Ready Active Leader ``` ### 关键参数说明 | 参数 | 说明 | |-------------------|---------------------------------------------------------------------| | `--token` | Manager专用令牌(以`SWMTKN-1`开头) | | `:2377` | Swarm管理端口(必须开放TCP) | | `sudo` | 非root用户操作时需要权限提升 | ### 注意事项 1. 建议保持奇数个Manager节点(3/5/7个)以确保Raft共识算法稳定性 2. 新Manager节点需要开放以下端口: - TCP 2377(集群管理通信) - TCP/UDP 7946(节点间通信) - UDP 4789(覆盖网络) 3. Manager节点应分布在不同的物理节点以保证高可用性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值