Beispiel #1
0
    IEnumerator ConsumeCoroutine(Item item)
    {
        ItemData itemData = item.Data;

        _isWaitingForItem = false;

        yield return(new WaitForEndOfFrame());

        _nextItemImage.gameObject.SetActive(false);
        _wantedItemImage.gameObject.SetActive(false);
        Destroy(item.gameObject);

        yield return(new WaitForSeconds(3f));

        if (itemData == _wantedItem)
        {
            _defuseAmount += 10f;
            _defuseAmountImage.fillAmount = Mathf.Clamp01(_defuseAmount / _defuseRequired);
            UIFlashDisplay.Instance.Flash(new Color(.3f, 1f, .3f, .3f));
            GetNewItem();
        }
        else
        {
            Vector3 direction = Random.insideUnitCircle.normalized;
            itemData.Create(transform.position + direction * 1.5f, direction);

            UIFlashDisplay.Instance.Flash(new Color(1f, .3f, .3f, .7f));
            CountdownController.Instance.WrongTool();

            yield return(new WaitForSeconds(.5f));

            _wantedItemImage.gameObject.SetActive(true);
            if (_itemList.Count > 0)
            {
                _nextItemImage.gameObject.SetActive(true);
            }
        }

        if (_defuseAmount >= _defuseRequired || _wantedItem == null)
        {
            UIFinalMenu.WON_GAME = true;
            SceneManager.LoadScene("FinalMenu");
        }
        else
        {
            _isWaitingForItem = true;
            Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, _triggerCollider.radius, 1 << LayerMask.NameToLayer("Item"));
            foreach (var collider in colliders)
            {
                Item castItem = collider.GetComponent <Item>();
                if (castItem)
                {
                    ConsumeItem(castItem);
                    break;
                }
            }
        }
    }
    public void Activate(System.Action callback)
    {
        var invItem = inventory.GetItemByName(item.itemName);

        if (invItem != null)
        {
            invItem.SetNumItems(invItem.GetNumItems() + quantityChange);
        }
        else if (quantityChange > 0)
        {
            var actualItem = item.Create(playerCharacter.GetCharacter());

            inventory.AddItem(actualItem);

            if (quantityChange > 1)
            {
                actualItem.SetNumItems(quantityChange);
            }
        }

        callback();
    }
Beispiel #3
0
        private ItemData GetItem(int index, ItemData recyclableItem, bool init)
        {
            if (_dataProvider == null || index < 0 || _dataProvider.DataCount <= index)
            {
                recyclableItem?.obj.SetActive(false);

                return(recyclableItem);
            }

            // 表示するGameObject
            var gameObj = _dataProvider.GetItemObj(index);

            if (gameObj == null)
            {
                return(null);
            }

            // キャッシュに登録されているか
            List <ItemData> objCaches;

            if (!_itemDataCaches.TryGetValue(gameObj, out objCaches))
            {
                objCaches = new List <ItemData>();
                _itemDataCaches.Add(gameObj, objCaches);
            }

            if (recyclableItem != null)
            {
                if (gameObj != recyclableItem.objOrigin)
                {
                    var caches = _itemDataCaches[recyclableItem.objOrigin];
                    caches.Add(recyclableItem);

                    recyclableItem = null;
                }
            }
            else
            {
                // キャッシュがあればそれを使用する。なければ新しく生成
                if (objCaches.Count > 0)
                {
                    recyclableItem       = objCaches[0];
                    recyclableItem.index = index;                       // 参照Index値を更新する
                    objCaches.RemoveAt(0);
                }
                else
                {
                    // なければ生成
                    // todo: ここは生成方法を選択できるようにしておくと良いかも
                    GameObject newObject = default;
                    if (_creator != null)
                    {
                        newObject = _creator.CreateScrollItem(index, gameObj, ScrollRect.content);
                    }

                    // nullの場合はデフォルトの生成方法を使用する
                    if (newObject == null)
                    {
                        newObject = _container.InstantiatePrefab(gameObj, ScrollRect.content);
                    }

                    recyclableItem = ItemData.Create(newObject, gameObj, index, _dataProvider.GetItemSize(index));

                    // 生成時には初期化フラグを強制的に立てる
                    init = true;
                }
            }

            if (recyclableItem.rectTransform.parent != ScrollRect.content)
            {
                recyclableItem.rectTransform.SetParent(ScrollRect.content, false);
            }

            // 座標の設定
            recyclableItem.rectTransform.anchoredPosition = GetVectorPositionByCache(index);
            recyclableItem.obj.SetActive(true);

            // 更新を伝える
            _dataProvider.ScrollItemUpdate(index, recyclableItem.obj, init);

            return(recyclableItem);
        }
Beispiel #4
0
 void PurchaseClicked()
 {
     inventory.Gold -= cost;
     inventory.AddItem(item.Create(playerCharacter.GetCharacter()));
 }