public static void UseEventListener <EntityT>(this EntityBehavior <EntityT> entityBehavior) where EntityT : Entity
 {
     if (entityBehavior.Entity.GetComponent <EventBus>())
     {
         (entityBehavior as IEventBehaviour)?.Bind(entityBehavior.Entity.GetComponent <EventBus>());
     }
 }
Esempio n. 2
0
 void Start()
 {
     typePicker = gameObject.AddComponent <TypePickerGUI>();
     typePicker.categoryNames = GameScripts.behaviorTabNames;
     UpdateBehaviorList();
     typePicker.handler = (PropertiesObjectType type) =>
     {
         PropertiesObjectType behaviorTypeWithTarget = new PropertiesObjectType(
             type, () =>
         {
             EntityBehavior behavior = (EntityBehavior)type.Create();
             if (targetEntityIsActivator)
             {
                 behavior.targetEntityIsActivator = true;
             }
             else if (targetEntity != null)
             {
                 behavior.targetEntity = new EntityReference(targetEntity);
             }
             return(behavior);
         });
         handler(behaviorTypeWithTarget);
         Destroy(this);
     };
     typePicker.enabled = false;
 }
Esempio n. 3
0
    private void ReadEntity(JSONObject entityObject, Entity entity)
    {
        ReadPropertiesObject(entityObject, entity);

        if (entityObject["sensor"] != null)
        {
            JSONObject sensorObject = entityObject["sensor"].AsObject;
            string     sensorName   = sensorObject["name"];
            var        sensorType   = GameScripts.FindTypeWithName(GameScripts.sensors, sensorName);
            if (sensorType == null)
            {
                warnings.Add("Unrecognized sensor: " + sensorName);
            }
            else
            {
                Sensor newSensor = (Sensor)sensorType.Create();
                ReadPropertiesObject(sensorObject, newSensor);
                entity.sensor = newSensor;
            }
        }

        if (entityObject["behaviors"] != null)
        {
            foreach (JSONNode behaviorNode in entityObject["behaviors"].AsArray)
            {
                JSONObject behaviorObject = behaviorNode.AsObject;
                string     behaviorName   = behaviorObject["name"];
                var        behaviorType   = GameScripts.FindTypeWithName(GameScripts.behaviors, behaviorName);
                if (behaviorType == null)
                {
                    warnings.Add("Unrecognized behavior: " + behaviorName);
                    continue;
                }
                EntityBehavior newBehavior = (EntityBehavior)behaviorType.Create();
                ReadPropertiesObject(behaviorObject, newBehavior);
                if (fileWriterVersion <= 5 && behaviorObject["target"] != null)
                {
                    if (behaviorObject["target"] == "activator")
                    {
                        newBehavior.target = new EntityBehavior.BehaviorTargetProperty(true);
                    }
                    else
                    {
                        newBehavior.target = new EntityBehavior.BehaviorTargetProperty(
                            new EntityReference(new System.Guid(behaviorObject["target"])));
                    }
                }
                entity.behaviors.Add(newBehavior);
            }
        }

        if (entityObject["id"] != null)
        {
            System.Guid id = new System.Guid(entityObject["id"]);
            EntityReference.AddExistingEntityId(entity, id);
        }
    }
    private void UpdateBehaviorOnThisFrame()
    {
        EntityBehavior nextBehavior = currentBehavior?.GetCurrentBehavior();

        if (nextBehavior != null)
        {
            BehaviorSwitch(nextBehavior);
        }
    }
Esempio n. 5
0
    void OnTriggerEnter(Collider other)
    {
        Transform      colliderTransform = other.transform;
        EntityBehavior entityBehavior    = colliderTransform.GetComponent <EntityBehavior>();

        if (entityBehavior)
        {
            BoxCollider box = gameObject.GetComponent <BoxCollider>();
            entityBehavior.OnKnockBarrier(box);
        }
    }
Esempio n. 6
0
 public static void BehaviorUpdated(Entity entity, EntityBehavior behavior)
 {
     if (!IsEditorPreviewBehavior(behavior))
     {
         return;
     }
     EntityDeselected();
     if (entity != null)
     {
         EntitySelected(entity);
     }
 }
Esempio n. 7
0
 static int RemoveAllEffectGameObject(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 1);
         EntityBehavior obj = (EntityBehavior)ToLua.CheckObject(L, 1, typeof(EntityBehavior));
         obj.RemoveAllEffectGameObject();
         return(0);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
Esempio n. 8
0
 static int OnRecycle(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 1);
         EntityBehavior obj = (EntityBehavior)ToLua.CheckObject(L, 1, typeof(EntityBehavior));
         obj.OnRecycle();
         return(0);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
Esempio n. 9
0
 static int UpdateLogic(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 2);
         EntityBehavior obj  = (EntityBehavior)ToLua.CheckObject(L, 1, typeof(EntityBehavior));
         float          arg0 = (float)LuaDLL.luaL_checknumber(L, 2);
         obj.UpdateLogic(arg0);
         return(0);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
Esempio n. 10
0
 static int OnKnockBarrier(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 2);
         EntityBehavior          obj  = (EntityBehavior)ToLua.CheckObject(L, 1, typeof(EntityBehavior));
         UnityEngine.BoxCollider arg0 = (UnityEngine.BoxCollider)ToLua.CheckUnityObject(L, 2, typeof(UnityEngine.BoxCollider));
         obj.OnKnockBarrier(arg0);
         return(0);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
Esempio n. 11
0
 static int CastEffect(IntPtr L)
 {
     try
     {
         int            count = LuaDLL.lua_gettop(L);
         EntityBehavior obj   = (EntityBehavior)ToLua.CheckObject(L, 1, typeof(EntityBehavior));
         string         arg0  = ToLua.CheckString(L, 2);
         object[]       arg1  = ToLua.ToParamsObject(L, 3, count - 2);
         obj.CastEffect(arg0, arg1);
         return(0);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
Esempio n. 12
0
    // Start is called before the first frame update
    void Start()
    {
        if (entity == null)
        {
            Debug.LogError("There is no entity in the game, please setup one.");
            return;
        }

        OxyScript   = GameObject.Find("OxygenBar").GetComponent <OxygenBarScript>();
        scriptTimer = GameObject.Find("TimeRemainingText").GetComponent <Begin_Script>();

        GMScript = GameObject.Find("GameManager").GetComponent <GameManagerScript>();

        scriptSpeed       = GameObject.Find("EntityUnit").GetComponent <EntityBehavior>();
        scriptSpeed.speed = 0;
    }
Esempio n. 13
0
 static int GetEntityBehavior(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 2);
         EntityBehaviorMgr obj  = (EntityBehaviorMgr)ToLua.CheckObject(L, 1, typeof(EntityBehaviorMgr));
         string            arg0 = ToLua.CheckString(L, 2);
         EntityBehavior    o    = obj.GetEntityBehavior(arg0);
         ToLua.Push(L, o);
         return(1);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
Esempio n. 14
0
    public override EntityBehavior GetCurrentBehavior()
    {
        direction = transform.position - objectToFollow.transform.position;

        FlipSpriteAndHitbox();

        EntityBehavior resultBehavior = this;

        // Step 1. Perform the desired behavior
        moveDir      = (objectToFollow.transform.position - this.transform.position).normalized;
        _rb.velocity = new Vector3(
            moveDir.x * movementSpeed,
            _rb.velocity.y,
            _rb.velocity.z
            );

        // Step 2. Determine if behavior should switch

        var rangeTest = Vector3.Distance(objectToFollow.transform.position, this.transform.position);

        // #if UNITY_EDITOR
        // Debug.Log("Distance: " + rangeTest);
        // #endif

        if (rangeTest > followRange)
        {
            resultBehavior = idleBehavior;

            // slows the rigidbody...
            _rb.velocity *= movementFalloff;
        }

        foreach (var hit in Physics.SphereCastAll(transform.position, sphereCastRadius, Vector3.up, 0f))
        {
            if (hit.collider.gameObject.tag == "Player")
            {
                _rb.velocity  *= movementFalloff;
                resultBehavior = attackBehavior;
                _anim.SetTrigger("attack");
                attackBehavior.ResetAtkTimer();
            }
        }

        // Step 3. return new behavior

        return(resultBehavior);
    }
Esempio n. 15
0
    static int set_Speed(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            EntityBehavior obj  = (EntityBehavior)o;
            float          arg0 = (float)LuaDLL.luaL_checknumber(L, 2);
            obj.Speed = arg0;
            return(0);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index Speed on a nil value" : e.Message));
        }
    }
Esempio n. 16
0
    static int set_uid(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            EntityBehavior obj  = (EntityBehavior)o;
            string         arg0 = ToLua.CheckString(L, 2);
            obj.uid = arg0;
            return(0);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index uid on a nil value" : e.Message));
        }
    }
Esempio n. 17
0
    static int get_effectComp(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            EntityBehavior obj = (EntityBehavior)o;
            EffectComp     ret = obj.effectComp;
            ToLua.Push(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index effectComp on a nil value" : e.Message));
        }
    }
Esempio n. 18
0
    static int get_isRecyled(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            EntityBehavior obj = (EntityBehavior)o;
            bool           ret = obj.isRecyled;
            LuaDLL.lua_pushboolean(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index isRecyled on a nil value" : e.Message));
        }
    }
Esempio n. 19
0
    static int get_uid(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            EntityBehavior obj = (EntityBehavior)o;
            string         ret = obj.uid;
            LuaDLL.lua_pushstring(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index uid on a nil value" : e.Message));
        }
    }
Esempio n. 20
0
    static int get_entityType(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            EntityBehavior obj = (EntityBehavior)o;
            int            ret = obj.entityType;
            LuaDLL.lua_pushinteger(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index entityType on a nil value" : e.Message));
        }
    }
Esempio n. 21
0
    static int get_Speed(IntPtr L)
    {
        object o = null;

        try
        {
            o = ToLua.ToObject(L, 1);
            EntityBehavior obj = (EntityBehavior)o;
            float          ret = obj.Speed;
            LuaDLL.lua_pushnumber(L, ret);
            return(1);
        }
        catch (Exception e)
        {
            return(LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index Speed on a nil value" : e.Message));
        }
    }
Esempio n. 22
0
    private void ReadEntity(MessagePackObjectDictionary entityDict, Entity entity)
    {
        ReadPropertiesObject(entityDict, entity);

        if (entityDict.ContainsKey(FileKeys.ENTITY_SENSOR))
        {
            var    sensorDict = entityDict[FileKeys.ENTITY_SENSOR].AsDictionary();
            string sensorName = sensorDict[FileKeys.PROPOBJ_NAME].AsString();
            var    sensorType = GameScripts.FindTypeWithName(GameScripts.sensors, sensorName);
            if (sensorType == null)
            {
                warnings.Add("Unrecognized sensor: " + sensorName);
            }
            else
            {
                Sensor newSensor = (Sensor)sensorType.Create();
                ReadPropertiesObject(sensorDict, newSensor);
                entity.sensor = newSensor;
            }
        }

        if (entityDict.ContainsKey(FileKeys.ENTITY_BEHAVIORS))
        {
            foreach (var behaviorObj in entityDict[FileKeys.ENTITY_BEHAVIORS].AsList())
            {
                var    behaviorDict = behaviorObj.AsDictionary();
                string behaviorName = behaviorDict[FileKeys.PROPOBJ_NAME].AsString();
                var    behaviorType = GameScripts.FindTypeWithName(GameScripts.behaviors, behaviorName);
                if (behaviorType == null)
                {
                    warnings.Add("Unrecognized behavior: " + behaviorName);
                    continue;
                }
                EntityBehavior newBehavior = (EntityBehavior)behaviorType.Create();
                ReadPropertiesObject(behaviorDict, newBehavior);
                entity.behaviors.Add(newBehavior);
            }
        }

        if (entityDict.ContainsKey(FileKeys.ENTITY_ID))
        {
            System.Guid id = new System.Guid(entityDict[FileKeys.ENTITY_ID].AsString());
            EntityReference.AddExistingEntityId(entity, id);
        }
    }
Esempio n. 23
0
    public override void onAssetAsyncLoadObjectCB(string name, UnityEngine.Object obj, Asset asset)
    {
        this.name = asset.source;
        if (hud_infosObj != null)
        {
            hud_infosObj.transform.parent = null;
        }

        if (gameObject != null)
        {
            UnityEngine.GameObject.Destroy(gameObject);
            gameObject = null;
        }

        base.onAssetAsyncLoadObjectCB(name, obj, asset);

        gameEntity          = gameObject.GetComponent <EntityBehavior>();
        gameEntity.seo      = this;
        gameEntity.isPlayer = isPlayer;
    }
Esempio n. 24
0
    public void Destroy(string uid)
    {
        EntityBehavior e = GetEntityBehavior(uid);

        if (e != null)
        {
            GameObject gameObject = e.gameObject;
            if (gameObject != null)
            {
                e.OnRecycle();
                Transform body = gameObject.transform.FindChild("Body");
                if (body != null)
                {
                    body.name = gameObject.name;                      // 名字改回去
                    ObjectPoolManager.RecycleObject(body.gameObject); // 只回收Body
                }
                GameObject.DestroyImmediate(gameObject);
            }
            entityBehaviors.Remove(uid);
        }
    }
Esempio n. 25
0
        public Battle(EntityCharacteristic ec1, EntityCharacteristic ec2)
        {
            EntityBehavior eb1 = Interaction.Get(ec1.Type, ec2.Type);
            EntityBehavior eb2 = Interaction.Get(ec2.Type, ec1.Type);

            this.Luck = false;
            if (eb1 == eb2)
            {
                bool firstwon = this._random.NextDouble() < (ec1.WinRate / (ec1.WinRate + ec2.WinRate));
                this.Winner = firstwon ? ec1 : ec2;
                this.Loser  = firstwon ? ec2 : ec1;
                this.Luck   = true;
            }
            else if (eb1 == EntityBehavior.Run || eb2 == EntityBehavior.Run)
            {
                this.Winner = (eb1 == EntityBehavior.Run) ? ec2 : ec1;
                this.Loser  = (eb1 == EntityBehavior.Run) ? ec1 : ec2;
            }
            else if (eb1 != eb2)
            {
                this.Winner = (eb1 == EntityBehavior.Attack) ? ec1 : ec2;
                this.Loser  = (eb1 == EntityBehavior.Attack) ? ec2 : ec1;
            }
            if (this.Winner != null)
            {
                this.WBehavior = Interaction.Get(this.Winner.Type, this.Loser.Type);
            }
            else
            {
                this.WBehavior = null;
            }
            if (this.Loser != null)
            {
                this.LBehavior = Interaction.Get(this.Loser.Type, this.Winner.Type);
            }
            else
            {
                this.LBehavior = null;
            }
        }
Esempio n. 26
0
    public override EntityBehavior GetCurrentBehavior()
    {
        EntityBehavior resultBehavior = this;

        // Step 1. Perform the desired behavior

        // Step 2. Determine if behavior should switch

        foreach (var hit in Physics.SphereCastAll(transform.position, sphereCastRadius, Vector3.up, 0f))
        {
            if (hit.collider.gameObject.tag == "Player")
            {
                resultBehavior = followBehavior;
                followBehavior.objectToFollow = hit.collider.gameObject;
                followBehavior.followRange    = sphereCastRadius;
            }
        }

        // Step 3. return new behavior

        return(resultBehavior);
    }
Esempio n. 27
0
 static int AddEffectGameObject(IntPtr L)
 {
     try
     {
         ToLua.CheckArgsCount(L, 9);
         EntityBehavior      obj  = (EntityBehavior)ToLua.CheckObject(L, 1, typeof(EntityBehavior));
         string              arg0 = ToLua.CheckString(L, 2);
         string              arg1 = ToLua.CheckString(L, 3);
         float               arg2 = (float)LuaDLL.luaL_checknumber(L, 4);
         UnityEngine.Vector3 arg3 = ToLua.ToVector3(L, 5);
         UnityEngine.Vector3 arg4 = ToLua.ToVector3(L, 6);
         UnityEngine.Vector3 arg5 = ToLua.ToVector3(L, 7);
         bool arg6 = LuaDLL.luaL_checkboolean(L, 8);
         bool arg7 = LuaDLL.luaL_checkboolean(L, 9);
         obj.AddEffectGameObject(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
         return(0);
     }
     catch (Exception e)
     {
         return(LuaDLL.toluaL_exception(L, e));
     }
 }
    public override EntityBehavior GetCurrentBehavior()
    {
        EntityBehavior resultBehavior = this;

        // Step 1. Perform the desired behavior

        UpdateAtkTimer();

        #if UNITY_EDITOR
        Debug.Log("[Entity] attacking [Player]");
        #endif

        // Step 2. Determine if behavior should switch

        if (currAtkTime == 0)
        {
            resultBehavior = idleBehavior;
        }

        // Step 3. return new behavior

        return(resultBehavior);
    }
Esempio n. 29
0
 void SetBehavior(EntityBehavior behavior)
 {
     entityBehavior = behavior;
 }
Esempio n. 30
0
    private void EntityPropertiesGUI()
    {
        Entity singleSelectedEntity = null;

        if (selectedEntities.Count == 1)
        {
            singleSelectedEntity = selectedEntities[0];
        }

        EntityReferencePropertyManager.Reset(singleSelectedEntity); // could be null and that's fine (?)

        GUILayout.BeginVertical(GUI.skin.box);
        PropertiesObjectGUI(editEntity);
        GUILayout.EndVertical();

        if (singleSelectedEntity != null && !(singleSelectedEntity is PlayerObject))
        {
            GUILayout.BeginHorizontal();
            if (GUIUtils.HighlightedButton("Clone"))
            {
                if (singleSelectedEntity is ObjectEntity)
                {
                    ObjectEntity clone     = (ObjectEntity)(singleSelectedEntity.Clone());
                    var          pickerGUI = gameObject.AddComponent <FacePickerGUI>();
                    pickerGUI.voxelArray = voxelArray;
                    pickerGUI.message    = "Tap to place clone";
                    pickerGUI.pickAction = () =>
                    {
                        if (!voxelArray.PlaceObject(clone))
                        {
                            DialogGUI.ShowMessageDialog(gameObject, ActionBarGUI.OBJECT_NO_ROOM_ERROR);
                        }
                    };
                }
                else if (singleSelectedEntity is Substance)
                {
                    Substance clone = (Substance)(singleSelectedEntity.Clone());
                    clone.defaultPaint                = voxelArray.GetSelectedPaint();
                    clone.defaultPaint.addSelected    = false;
                    clone.defaultPaint.storedSelected = false;
                    voxelArray.substanceToCreate      = clone;
                    var createGUI = gameObject.AddComponent <CreateSubstanceGUI>();
                    createGUI.voxelArray = voxelArray;
                }
            }
            if (GUIUtils.HighlightedButton("Delete"))
            {
                DeleteButton();
            }
            GUILayout.EndHorizontal();
        }
        if (selectedEntities.Count > 1)
        {
            if (GUIUtils.HighlightedButton("Delete"))
            {
                DeleteButton();
            }
        }

        TutorialGUI.TutorialHighlight("change sensor");
        if (GUILayout.Button("Change Sensor"))
        {
            TypePickerGUI sensorMenu = gameObject.AddComponent <TypePickerGUI>();
            sensorMenu.title      = "Change Sensor";
            sensorMenu.categories = new PropertiesObjectType[][] { GameScripts.sensors };
            sensorMenu.handler    = (PropertiesObjectType type) =>
            {
                foreach (Entity entity in selectedEntities)
                {
                    entity.sensor = (Sensor)type.Create();
                }
                voxelArray.unsavedChanges = true;
                UpdateEditEntity();
            };
        }
        TutorialGUI.ClearHighlight();
        GUILayout.BeginVertical(GUI.skin.box);
        PropertiesObjectGUI(editSensor, " Sensor");
        GUILayout.EndVertical();

        TutorialGUI.TutorialHighlight("add behavior");
        if (GUILayout.Button("Add Behavior"))
        {
            NewBehaviorGUI behaviorMenu = gameObject.AddComponent <NewBehaviorGUI>();
            behaviorMenu.title      = "Add Behavior";
            behaviorMenu.self       = singleSelectedEntity;
            behaviorMenu.voxelArray = voxelArray;
            behaviorMenu.handler    = (PropertiesObjectType behaviorType) =>
            {
                foreach (Entity entity in selectedEntities)
                {
                    EntityBehavior newBehavior = (EntityBehavior)behaviorType.Create();
                    // with multiple selected entities, NewBehaviorGUI doesn't check if behaviors
                    // are valid for the selected entities
                    if (newBehavior.targetEntity.entity == null && !newBehavior.targetEntityIsActivator &&
                        !newBehavior.BehaviorObjectType().rule(entity))
                    {
                        continue;
                    }
                    entity.behaviors.Add(newBehavior);
                    EntityPreviewManager.BehaviorUpdated(singleSelectedEntity, newBehavior);
                }
                voxelArray.unsavedChanges = true;
                UpdateEditEntity();
                scrollVelocity = new Vector2(0, 2000 * editBehaviors.Count); // scroll to bottom
            };
        }
        TutorialGUI.ClearHighlight();

        Color guiBaseColor = GUI.backgroundColor;
        StoredEntityBehavior behaviorToRemove = null;

        foreach (StoredEntityBehavior storedBehavior in editBehaviors)
        {
            TutorialGUI.TutorialHighlight("behaviors");
            Entity behaviorTarget = null;
            if (storedBehavior.sharedTarget)
            {
                behaviorTarget = storedBehavior.allBehaviors[0].targetEntity.entity;
            }
            if (behaviorTarget != null)
            {
                EntityReferencePropertyManager.Next(behaviorTarget);
                GUI.backgroundColor = guiBaseColor * EntityReferencePropertyManager.GetColor();
            }
            EntityReferencePropertyManager.SetBehaviorTarget(behaviorTarget);
            GUILayout.BeginVertical(GUI.skin.box);
            GUI.backgroundColor = guiBaseColor;
            PropertiesObjectGUI(storedBehavior, " Behavior",
                                () => EntityPreviewManager.BehaviorUpdated(singleSelectedEntity,
                                                                           storedBehavior.allBehaviors[0]));
            if (GUILayout.Button("Remove"))
            {
                behaviorToRemove = storedBehavior;
            }
            GUILayout.EndVertical();
            // clear this every time, in case the next target is the same
            EntityReferencePropertyManager.SetBehaviorTarget(null);
        }

        if (behaviorToRemove != null)
        {
            foreach (Entity entity in selectedEntities)
            {
                foreach (EntityBehavior remove in behaviorToRemove.allBehaviors)
                {
                    if (entity.behaviors.Remove(remove))
                    {
                        break;
                    }
                }
            }
            voxelArray.unsavedChanges = true;
            UpdateEditEntity();
            EntityPreviewManager.BehaviorUpdated(singleSelectedEntity, behaviorToRemove.allBehaviors[0]);
        }

        if (mismatchedSelectedBehaviorCounts)
        {
            GUILayout.BeginVertical(GUI.skin.box);
            GUILayout.Label("(other behaviors...)", GUIStyleSet.instance.labelTitle);
            GUILayout.EndVertical();
        }
    }