コード例 #1
0
    void OnEnable()
    {
        alpha      = 0;
        prevAlpha  = 0;
        IsActive   = true;
        MeshObject = this.gameObject;

        var meshRenderer     = MeshObject.GetComponentInChildren <MeshRenderer>();
        var skinMeshRenderer = MeshObject.GetComponentInChildren <SkinnedMeshRenderer>();

        if (meshRenderer != null)
        {
            startingMaterial = meshRenderer.material;
        }

        if (skinMeshRenderer != null)
        {
            startingMaterial = meshRenderer.material;
        }

        foreach (var comp in ComponentsPS)
        {
            comp.SetActive(false);
        }

        spiritSystem = GetComponentInParent <SpiritSystem>();
    }
コード例 #2
0
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Time.timeScale = 0;
            menuPanel.SetActive(true);
            Cursor.visible   = true;
            Cursor.lockState = CursorLockMode.None;
        }

        if (cardUISystem == null)
        {
            cardUISystem = FindObjectOfType <CardUISystem>();
        }

        if (SceneManager.GetActiveScene() != currentScene)
        {
            if (spiritSystem == null)
            {
                spiritSystem = FindObjectOfType <SpiritSystem>();
                if (spiritToEquipInDungeon != null && FindObjectOfType <StateManager>())
                {
                    spiritSystem.spiritEquipped = spiritToEquipInDungeon;
                    spiritSystem.OnEquipSpirit(spiritToEquipInDungeon);
                }
            }
        }
    }
コード例 #3
0
        public static SpiritSystem Spirit(SpiritData data, Vector3 position, bool isOwnedByPlayer = true)
        {
            var newSpiritPrefab = U.Instantiate(data.Prefab, position, Quaternion.identity, ReferenceHolder.Instance.SpiritParent);
            var newSpirit       = new SpiritSystem(newSpiritPrefab, isOwnedByPlayer)
            {
                Data     = data,
                UsedCell = null
            };

            newSpirit.SetSystem(GameData.Instance.Player);
            PlaceEffect(newSpirit.Data.Base.Element, newSpiritPrefab.transform.position);
            return(newSpirit);
        }
コード例 #4
0
        void OnUpgrading()
        {
            if (CheckGradeListOk(out List <SpiritData> grades))
            {
                var upgradedSpiritPrefab = Instantiate(
                    grades[ChoosedSpirit.Data.GradeCount + 1].Prefab,
                    ChoosedSpirit.Prefab.transform.position,
                    Quaternion.identity,
                    ReferenceHolder.Instance.SpiritParent);
                var upgradedSpirit = new SpiritSystem(upgradedSpiritPrefab, true);

                upgradedSpirit.Upgrade(ChoosedSpirit, grades[ChoosedSpirit.Data.GradeCount + 1]);
                upgradedSpirit.SetSystem(Owner);

                SpiritUpgraded?.Invoke(upgradedSpirit);
                SpiritSold?.Invoke(ChoosedSpirit);
                ChoosedSpirit = upgradedSpirit;
            }
            Owner.SpiritUISystem.ActivateUpgradeButton(ChoosedSpirit.Data.GradeCount < grades.Count - 1);
        }
コード例 #5
0
    void OnCollisionEnter(Collision collision)
    {
        print(collision.gameObject.name);

        SpiritSystem spiritSystem = FindObjectOfType <SpiritSystem>();

        if (spiritSystem != null)
        {
            if (spiritSystem.spiritEquipped.spiritClass == BaseSpirit.SpiritClass.Mage)
            {
                if (collision.gameObject.GetComponent <Enemy>())
                {
                    collision.gameObject.GetComponent <Enemy>().TakeDamage(spiritSystem.spiritEquipped.DamageModifier);
                }

                spiritSystem.MageDamage(collision.transform.position);
            }
            else if (spiritSystem.spiritEquipped.spiritClass == BaseSpirit.SpiritClass.Ranger)
            {
                if (collision.gameObject.GetComponent <Enemy>())
                {
                    spiritSystem.RangerDamage(collision.gameObject.GetComponent <Enemy>());
                }
            }
        }


        if (isCollided && !effectSettings.UseCollisionDetection)
        {
            return;
        }
        foreach (ContactPoint contact in collision.contacts)
        {
            if (!isCollided)
            {
                isCollided = true;

                //offsetColliderPoint = contact.otherCollider.transform.position - contact.point;
                // lastCollider = contact.otherCollider;
                // lastContactPoint = contact;
                if (UseTargetPositionAfterCollision)
                {
                    if (targetAnchor != null)
                    {
                        Destroy(targetAnchor);
                    }

                    targetAnchor                    = new GameObject();
                    targetAnchor.hideFlags          = HideFlags.HideAndDontSave;
                    targetAnchor.transform.parent   = contact.otherCollider.transform;
                    targetAnchor.transform.position = contact.point;
                    targetAnchor.transform.rotation = transform.rotation;
                    //targetAnchor.transform.LookAt(contact.normal);
                }
            }
            var handler = CollisionEnter;
            if (handler != null)
            {
                handler(this, new RFX4_CollisionInfo {
                    HitPoint = contact.point, HitCollider = contact.otherCollider, HitGameObject = contact.otherCollider.gameObject
                });
            }

            if (EffectOnCollision != null)
            {
                var instance = Instantiate(EffectOnCollision, contact.point, new Quaternion()) as GameObject;

                if (HUE > -0.9f)
                {
                    RFX4_ColorHelper.ChangeObjectColorByHUE(instance, HUE);
                }

                if (LookAtNormal)
                {
                    instance.transform.LookAt(contact.point + contact.normal);
                }
                else
                {
                    instance.transform.rotation = transform.rotation;
                }
                if (!CollisionEffectInWorldSpace)
                {
                    instance.transform.parent = contact.otherCollider.transform.parent;
                }
                Destroy(instance, CollisionEffectDestroyAfter);
            }
        }

        foreach (var obj in DeactivateObjectsAfterCollision)
        {
            if (obj != null)
            {
                var ps = obj.GetComponent <ParticleSystem>();
                if (ps != null)
                {
                    ps.Stop();
                }
                else
                {
                    obj.SetActive(false);
                }
            }
        }


        if (rigid != null)
        {
            Destroy(rigid);
        }
        if (collid != null)
        {
            Destroy(collid);
        }
    }
コード例 #6
0
        public void SetSystem(PlayerSystem player)
        {
            Owner = player;

            sellButton    = Instantiate(sellButton.gameObject, Owner.WorldCanvas.transform).GetComponent <Button>();
            upgradeButton = Instantiate(upgradeButton.gameObject, Owner.WorldCanvas.transform).GetComponent <Button>();

            Owner.InventoryUISystem.MoveItemToSpirit += OnMoveItemToSpirit;
            Owner.PlayerInputSystem.ClickedOnSpirit  += OnClickedOnSpirit;
            Owner.PlayerInputSystem.ClickedOnCell    += OnClickedOnCell;
            Owner.PlayerInputSystem.ClikedOnGround   += OnClickedOnGround;
            Owner.PlayerInputSystem.RMBPresed        += OnClickedOnGround;
            Owner.ItemDropSystem.ItemUICreated       += OnItemUICreated;

            sellButton.onClick.AddListener(OnSellButtonClick);
            upgradeButton.onClick.AddListener(OnUpgradeButtonClick);

            void OnUpgradeButtonClick()
            {
                Upgrading?.Invoke();
                UpdateUI();
            }

            void OnSellButtonClick()
            {
                Selling?.Invoke();
                ActivateUI(false);
            }

            void OnItemUICreated(ItemUISystem itemUI)
            {
                itemUI.DoubleClickedInSpiritInventory += OnItemDoubleClicked;
                itemUI.System.StatsApplied            += OnStatsApplied;

                void OnItemDoubleClicked(ItemUISystem _)
                {
                    if (itemUI.DraggedFrom == DraggedFrom.SpiritInventory)
                    {
                        RemoveItemFromSpirit();
                        MoveItemToPlayer?.Invoke(itemUI);
                    }

                    void RemoveItemFromSpirit()
                    {
                        if (itemUI.DraggedFrom == DraggedFrom.SpiritInventory)
                        {
                            allItemsUIInSpirits.Remove(itemUI);
                            isSlotEmpty[itemUI.SlotNumber] = true;
                            itemSlots[itemUI.SlotNumber].gameObject.SetActive(true);

                            ItemRemovedFromSpirit?.Invoke(new SpiritItemEventArgs(choosedSpirit, itemUI));
                            UpdateValues();
                        }
                    }
                }
            }

            void OnClickedOnSpirit(GameObject spirit) => ActivateUI(true);
            void OnClickedOnCell(GameObject spirit) => ActivateUI(false);
            void OnClickedOnGround() => ActivateUI(false);

            void OnMoveItemToSpirit(ItemUISystem itemUI)
            {
                var emptySlot = isSlotEmpty.IndexOf(true);

                if (emptySlot < 0)
                {
                    MoveItemToPlayer?.Invoke(itemUI);
                }
                else
                {
                    itemUI.transform.position = itemSlots[emptySlot].transform.position;
                    itemUI.transform.SetParent(itemSlots[emptySlot].transform.parent);

                    AddItemToSpirit(emptySlot);
                }

                void AddItemToSpirit(int slotNumber)
                {
                    allItemsUIInSpirits.Add(itemUI);
                    isSlotEmpty[slotNumber] = false;
                    itemSlots[slotNumber].gameObject.SetActive(false);

                    itemUI.DraggedFrom = DraggedFrom.SpiritInventory;
                    itemUI.SlotNumber  = slotNumber;

                    ItemAddedToSpirit?.Invoke(new SpiritItemEventArgs(choosedSpirit, itemUI));
                    UpdateItems();
                    UpdateValues();
                }
            }

            void ActivateUI(bool activate)
            {
                if (Owner.PlayerInputSystem.ChoosedSpirit == null)
                {
                    return;
                }

                UnsubscribeFromSpiritEvents();

                if (activate)
                {
                    baseAnimator.SetBool(isOpenBool, true);
                    choosedSpirit = Owner.PlayerInputSystem.ChoosedSpirit;

                    if (choosedSpirit.Owner == Owner)
                    {
                        sellButton.gameObject.SetActive(true);

                        sellButton.transform.position    = choosedSpirit.Prefab.transform.position + new Vector3(40, 30, 0);
                        upgradeButton.transform.position = choosedSpirit.Prefab.transform.position + new Vector3(40, 60, 30);
                    }

                    HideExpandedStatValues(true);
                    SubscribeToSpiritEvents();
                    UpdateUI();
                }
                else
                {
                    sellButton.gameObject.SetActive(false);
                    upgradeButton.gameObject.SetActive(false);

                    baseAnimator.SetBool(isOpenBool, false);
                    baseAnimator.SetBool(isExpandedBool, false);

                    UnsubscribeFromSpiritEvents();
                }

                void SubscribeToSpiritEvents()
                {
                    if (choosedSpirit == null)
                    {
                        return;
                    }

                    choosedSpirit.AbilityControlSystem.AbilityUsed += OnAbilityUsed;
                    choosedSpirit.EffectApplied += OnEffectApplied;
                    choosedSpirit.EffectRemoved += OnEffectRemoved;
                    choosedSpirit.StatsChanged  += OnStatsApplied;
                }

                void UnsubscribeFromSpiritEvents()
                {
                    if (choosedSpirit == null)
                    {
                        return;
                    }

                    choosedSpirit.AbilityControlSystem.AbilityUsed -= OnAbilityUsed;
                    choosedSpirit.EffectApplied -= OnEffectApplied;
                    choosedSpirit.EffectRemoved -= OnEffectRemoved;
                    choosedSpirit.StatsChanged  -= OnStatsApplied;
                }

                void OnEffectRemoved(Data.Effect effect)
                {
                    var appliedEffectUI = appliedEffectsUI.Find(effectUI => effectUI.EntityIndex == effect.Index);

                    if (appliedEffectUI != null)
                    {
                        appliedEffectUI.gameObject.SetActive(false);
                        appliedEffectsUI.Remove(appliedEffectUI);
                    }
                }

                void OnEffectApplied(Data.Effect effect)
                {
                    var poolObject      = appliedEffectsUIPool.PopObject();
                    var appliedEffectUI = poolObject.GetComponent <SlotWithCooldown>();

                    appliedEffectUI.Set(effect.Description, effect.Image, effect.Index);
                    appliedEffectsUI.Add(appliedEffectUI);
                }

                void OnAbilityUsed(AbilitySystem e)
                {
                    var slot = abilitySlots.Find(abilitySlot => abilitySlot.EntityIndex == e.Ability.Index);

                    slot.CooldownImage.fillAmount = 1f;

                    StartCoroutine(Cooldown());

                    IEnumerator Cooldown()
                    {
                        while (slot.CooldownImage.fillAmount > 0)
                        {
                            slot.CooldownImage.fillAmount -= 1 / e.Ability.Cooldown * Time.deltaTime * 2;
                            yield return(deltaTimeDelay);
                        }
                    }
                }
            }

            void UpdateUI()
            {
                choosedSpirit = Owner.PlayerInputSystem.ChoosedSpirit;

                UpdateItems();
                UpdateValues();
                UpdateSlotsWithCooldown(abilitySlots, choosedSpirit.Data.Abilities);
                UpdateSlotsWithCooldown(traitSlots, choosedSpirit.Data.Traits);

                void UpdateSlotsWithCooldown <T>(List <SlotWithCooldown> slots, List <T> slotEntities) where T : Entity
                {
                    slots.ForEach(slot => slot.gameObject.SetActive(false));

                    for (int i = 0; i < slotEntities.Count; i++)
                    {
                        slots[i].Set(slotEntities[i].Description, slotEntities[i].Image, slotEntities[i].Index);
                    }
                }
            }

            void UpdateItems()
            {
                var choosedSpiritItems = choosedSpirit.Data.Inventory.Items;
                var maxSlots           = choosedSpirit.Data.Get(Enums.Spirit.MaxInventorySlots).Value;

                isSlotEmpty.Clear();
                allItemsUIInSpirits.ForEach(item => item.gameObject.SetActive(false));

                UpdateSlotsAmount();

                choosedSpiritItems.ForEach(itemInInventory =>
                {
                    var itemFromDroppedItems = allItemsUIInSpirits.Find(droppedItem => itemInInventory.Index == droppedItem.System.Index);

                    if (itemFromDroppedItems != null)
                    {
                        itemFromDroppedItems.gameObject.SetActive(true);
                        isSlotEmpty[itemFromDroppedItems.SlotNumber] = false;
                    }
                });

                void UpdateSlotsAmount()
                {
                    for (int i = 0; i < itemSlots.Count; i++)
                    {
                        var isInSlotLimit = i < maxSlots;

                        itemSlots[i].gameObject.SetActive(isInSlotLimit);
                        isSlotEmpty.Add(isInSlotLimit);
                    }
                }
            }

            void OnStatsApplied() => UpdateValues();

            void UpdateValues()
            {
                var spirit = choosedSpirit.Data;

                spiritName.text = spirit.Name;
                image.sprite    = spirit.Image;

                SetExpBarValue();
                SetStatValues();

                void SetExpBarValue()
                {
                    var neededExp   = (float)ReferenceHolder.ExpToLevelUp[(int)spirit.Get(Numeral.Level).Value];
                    var currentExp  = (float)spirit.Get(Numeral.Exp).Value;
                    var expBarValue = 1 / (neededExp / currentExp);

                    expBar.fillAmount = expBarValue;
                }

                void SetStatValues()
                {
                    numeralStatValuesUI.ForEach(statUI => statUI.Value.text = statUI.NumeralValue.AttributeToString());
                    spiritStatValuesUI.ForEach(statUI => statUI.Value.text  = statUI.SpiritValue.AttributeToString());
                }
            }
        }
コード例 #7
0
 void OnSpiritPlaced(SpiritSystem spirit) => ActivateUI(false);
コード例 #8
0
ファイル: ItemSystem.cs プロジェクト: Sundownerr/Project-TD
 public void OnSpiritLevelUp(SpiritSystem e) => IncreaseStatsPerLevel();
コード例 #9
0
 public SpiritDataSystem(SpiritSystem spirit) => ownerSpirit = spirit;
コード例 #10
0
        void Update()
        {
            pointerEventData.position = Input.mousePosition;

            if (Input.GetMouseButtonDown(0))
            {
                WorldRay = Camera.main.ScreenPointToRay(Input.mousePosition);

                isHitUI = EventSystem.currentSelectedGameObject != null;

                if (!isHitUI)
                {
                    if (Physics.Raycast(WorldRay, out hit, 100000, layerMask))
                    {
                        var isMouseOnSpirit = hit.transform.gameObject.layer == 14;
                        var isMouseOnGround = hit.transform.gameObject.layer == 9;
                        var isMouseOnCell   = hit.transform.gameObject.layer == 15;
                        var isMouseOnEnemy  = hit.transform.gameObject.layer == 12;

                        if (ChoosedSpirit != null)
                        {
                            ChoosedSpirit.ShowRange(false);
                        }

                        if (isMouseOnSpirit)
                        {
                            GetChoosedSpirit();
                            ClickedOnSpirit?.Invoke(hit.transform.gameObject);
                        }

                        if (isMouseOnEnemy)
                        {
                            GetChoosedEnemy();
                            ClickedOnEnemy?.Invoke(hit.transform.gameObject);
                        }

                        if (isMouseOnGround)
                        {
                            ClikedOnGround?.Invoke();
                            ChoosedSpirit = null;
                            choosedEnemy  = null;
                            SetSelection(false);
                        }

                        if (isMouseOnCell)
                        {
                            ClickedOnCell?.Invoke(hit.transform.gameObject);
                            ChoosedSpirit = null;
                            choosedEnemy  = null;
                            SetSelection(false);
                        }
                    }
                }
            }

            if (Input.GetMouseButtonDown(1))
            {
                RMBPresed?.Invoke();
                ChoosedSpirit = null;
                choosedEnemy  = null;
                SetSelection(false);
            }


            #region Helper functions

            void GetChoosedSpirit()
            {
                ChoosedSpirit = Owner.SpiritControlSystem.AllSpirits.Find(spirit => spirit.Prefab == hit.transform.gameObject);
                ChoosedSpirit.ShowRange(true);
                Owner.SpiritUISystem.ActivateUpgradeButton(CheckGradeListOk(out _));
                ActivateSelection(ChoosedSpirit);
            }

            void GetChoosedEnemy()
            {
                choosedEnemy = Owner.EnemyControlSystem.AllEnemies.Find(enemy => enemy.Prefab == hit.transform.gameObject);
                ActivateSelection(choosedEnemy);
            }

            #endregion
        }
コード例 #11
0
ファイル: Cell.cs プロジェクト: Sundownerr/Project-TD
 void OnSpiritPlaced(SpiritSystem spirit) => ChoosedCell = null;