【问题标题】:Unity - going to the next level when glass it's full团结 - 玻璃满了就进入下一个层次
【发布时间】:2019-10-03 00:02:16
【问题描述】:

我正在尝试在杯子装满时使下一个级别可用。目前只有点击“下一关”按钮才会解锁下一关,重复关卡不会解锁下一关。

这里有图片供参考:

这是锁定关卡脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

[ExecuteInEditMode]
public class LockedLevels : MonoBehaviour {


    void Awake()
    {
        transform.GetChild(1).localScale = Vector3.one;
        PlayerPrefs.SetInt("1", 1);

        for (int i = 0; i < transform.GetChild(1).childCount; i++)
        {
            transform.GetChild(1).GetChild(i).gameObject.SetActive(false);
        }
        UnLockLevels();

    }
    void Update()
    {
        transform.GetChild(0).gameObject.GetComponent<Text>().text = transform.name;
        transform.GetChild(0).gameObject.GetComponent<Text>().fontSize = 75;
        if (Input.GetKeyDown(KeyCode.Delete))
        {
            PlayerPrefs.DeleteAll();
        }
    }

    public void UnLockLevels()
    {

        if (PlayerPrefs.GetInt(gameObject.name) == 1)
        {
            transform.GetChild(0).gameObject.GetComponent<Text>().color = new Color(1,1,1,1) ;
            GetComponent<Button>().interactable = true;
            if (PlayerPrefs.GetInt("Star" + gameObject.name) == 3)
            {
                for (int i = 0; i < transform.GetChild(1).childCount; i++)
                {
                    transform.GetChild(1).GetChild(i).gameObject.SetActive(true);
                }
            }
            else if (PlayerPrefs.GetInt("Star" + gameObject.name) == 2)
            {
                for (int i = 0; i < transform.GetChild(1).childCount-1; i++)
                {
                    transform.GetChild(1).GetChild(i).gameObject.SetActive(true);
                }
            }
            else if (PlayerPrefs.GetInt("Star" + gameObject.name) == 1)
            {
                transform.GetChild(1).GetChild(0).gameObject.SetActive(true);

            }
            else if (PlayerPrefs.GetInt("Star" + gameObject.name) == 0)
            {
                for (int i = 0; i < transform.GetChild(1).childCount; i++)
                {
                    transform.GetChild(1).GetChild(i).gameObject.SetActive(false);
                }
            }
        }
        else
        {
            GetComponent<Button>().interactable = false;
            transform.GetChild(0).gameObject.GetComponent<Text>().color = new Color(1, 1, 1, .5f);
        }
    }
    public void LevelMenu()
    {
        SceneManager.LoadScene(transform.name);
    }
}

这是 glassFill 脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GlassFill : MonoBehaviour {

    int trigCont;
    GameManager gm;
    int Star;
    // Use this for initialization
    void Start () {
        gm = FindObjectOfType<GameManager>();
    }

    // Update is called once per frame
    void Update () {

    }
    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.tag == "DynamicParticle")
        {
            if (trigCont == 0)
            {
                transform.parent.GetChild(0).GetComponent<SpriteRenderer>().sprite = gm.SurpriseGlass;

            }
            col.gameObject.tag = "InGlassWater";
            col.gameObject.GetComponent<Rigidbody2D>().gravityScale = .3f;
            col.gameObject.GetComponent<Rigidbody2D>().velocity = col.gameObject.GetComponent<Rigidbody2D>().velocity /4;
            trigCont++;

            if (trigCont > 50)
            {
                if (trigCont == 51)
                {
                    if (Mathf.FloorToInt(gm.PenCapacity.value * 100) > 75)
                    {
                        Star = 3;
                    }
                    else if (Mathf.FloorToInt(gm.PenCapacity.value * 100) > 50)
                    {
                        Star = 2;
                    }
                    else if (Mathf.FloorToInt(gm.PenCapacity.value * 100) > 25)
                    {
                        Star = 1;
                    }
                    print(Star + "star");
                    transform.parent.GetChild(0).GetComponent<SpriteRenderer>().sprite = gm.HappyGlass;
                    Camera.main.GetComponent<AudioSource>().Play();
                    Invoke("nextScene", 2);
                    CancelInvoke("Check");
                    for (int i = 0; i < Camera.main.transform.childCount; i++)
                    {
                        if (Camera.main.transform.GetChild(i).GetComponent<ParticleSystem>() != null)
                        {
                            Camera.main.transform.GetChild(i).GetComponent<ParticleSystem>().Play();
                        }
                    }
                }               
            }
            else
            {
                CancelInvoke("Check");
                Invoke("Check",5);
            }
            if (trigCont > 60)
            {                                               //You can write  a function over here if you want to give a star according to glass fill
                print("two star");
            }           
            if (trigCont > 70)
            {
                print("three star");
            }
        }
    }
    void Check()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
    void nextScene()
    {
        PlayerPrefs.SetInt((SceneManager.GetActiveScene().buildIndex).ToString(), 1);
        PlayerPrefs.SetInt("Star" + SceneManager.GetActiveScene().name, Star);
        gm.LevComp.SetActive(true);
        if (Star > 2)
        {
            gm.LevComp.transform.GetChild(0).gameObject.SetActive(true);
            gm.LevComp.transform.GetChild(1).gameObject.SetActive(true);
            gm.LevComp.transform.GetChild(2).gameObject.SetActive(true);
        } 
        else if (Star > 1)
        {
            gm.LevComp.transform.GetChild(0).gameObject.SetActive(true);
            gm.LevComp.transform.GetChild(1).gameObject.SetActive(true);
        }
        else if (Star>0)
        {
            gm.LevComp.transform.GetChild(0).gameObject.SetActive(true);
        }
    }
}

【问题讨论】:

  • 请编辑您的问题以显示您的对象层次结构以及GlassFillLockedLevels 附加到哪些对象。 (最好是截图,但文字也可以)

标签: c# unity3d 2d-games


【解决方案1】:

检查玻璃是否已满的一种方法是制作玻璃的许多小的子对象。他们每个人都有一个对撞机。如果所有或一定百分比的子对象都与某种水接触。然后你会知道杯子已经满了,你可以进入下一个级别。您可以每秒运行一次此检查。

只需列出每个子对象的列表,然后大约每秒检查一次它们的状态。

【讨论】:

  • 我该怎么做?
  • 做什么?将对象添加到列表中?
【解决方案2】:

假设您的场景中有一个名为 levelManagerGO 的空游戏对象,其中包含脚本 LockedLevels。我相信需要调用的方法是UnLockLevels()。所以你应该在你的脚本 GlassFill 中创建一个对包含 LockedLevels 的空游戏对象的引用,这样你就可以调用UnLockLevels()

levelManagerGO.Invoke("UnLockLevels", 0f);

https://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多