当游戏中的玩家死亡时,尝试编程两个按钮

时间:2017-06-08 10:59:31

标签: c# visual-studio unity3d syntax

我正在写信请求帮助。我正在尝试将两个按钮编程为主菜单和我游戏中的退出按钮,仅在我的播放器死亡时出现。我一直试图用,

定义游戏对象列表

GameManager脚本。

//Awake is always called before any Start functions
void Awake()
{
    //Check if instance already exists
    if (instance == null)

        //if not, set instance to this
        instance = this;

    //If instance already exists and it's not this:
    else if (instance != this)

        //Then destroy this. This enforces our singleton pattern, meaning there can only ever be one instance of a GameManager.
        Destroy(gameObject);

    //Sets this to not be destroyed when reloading scene
    DontDestroyOnLoad(gameObject);

    //Assign enemies to a new List of Enemy objects.
    enemies = new List<Enemy>();

    //Get a component reference to the attached BoardManager script
    boardScript = GetComponent<BoardManager>();

    //Call the InitGame function to initialize the first level 
    //InitGame();
}

// TODO: Uncommented Code
/// <summary>
/// Called when the level / scene has finished loading
/// </summary>
/// <param name="scene"></param>
/// <param name="mode"></param>
void OnLevelFinishedLoading(Scene scene, LoadSceneMode mode)
{
    // Don't initialize game on main menu. That would be silly
    if (scene.buildIndex > 0)
    {
        InitGame();
    }

    level++; // Increment after we have loaded level. Might be a better place to put this
}

// TODO: Uncomemnted code
void OnEnable()
{
    SceneManager.sceneLoaded += OnLevelFinishedLoading;
}

void OnDisable()
{
    SceneManager.sceneLoaded -= OnLevelFinishedLoading;
}

//Initializes the game for each level.
void InitGame()
{
    //While doingSetup is true the player can't move, prevent player from moving while title card is up.
    doingSetup = true;

    //Get a reference to our image LevelImage by finding it by name.
    levelImage = GameObject.Find("LevelImage");

    //Get a reference to our text LevelText's text component by finding it by name and calling GetComponent.
    levelText = GameObject.Find("LevelText").GetComponent<Text>();

    //Set the text of levelText to the string "Day" and append the current level number.
    levelText.text = "Day " + level;

    //Set levelImage to active blocking player's view of the game board during setup.
    levelImage.SetActive(true);

    //Call the HideLevelImage function with a delay in seconds of levelStartDelay.
    Invoke("HideLevelImage", levelStartDelay);

    //Clear any Enemy objects in our List to prepare for next level.
    enemies.Clear();

    //Call the SetupScene function of the BoardManager script, pass it current level number.
    boardScript.SetupScene(level);

    // TODO: Removed initGame() from here. No need to call it twice
}

//Hides black image used between levels
void HideLevelImage()
{
    //Disable the levelImage gameObject.
    levelImage.SetActive(false);

    //Set doingSetup to false allowing player to move again.
    doingSetup = false;
}

//Update is called every frame.
void Update()
{
    //Check that playersTurn or enemiesMoving or doingSetup are not currently true.
    if (playersTurn || enemiesMoving || doingSetup)

        //If any of these are true, return and do not start MoveEnemies.
        return;

    //Start moving enemies.
    StartCoroutine(MoveEnemies());
}

//Call this to add the passed in Enemy to the List of Enemy objects.
public void AddEnemyToList(Enemy script)
{
    //Add Enemy to List enemies.
    enemies.Add(script);
}

public void ShowButtons()
{
    foreach (var Button in buttons)
    {
        var gameOver = GetComponent<Exit2>();
        Button.gameObject.SetActive(true);
    }
}

//GameOver is called when the player reaches 0 food points
public void GameOver()
{
    //Set levelText to display number of levels passed and game over message
    levelText.text = "After " + level + " days, you starved.";

    //Shows buttons on player's death.
    var gameOver = GetComponent<Exit2>();
    gameOver.ShowButtons("Main menu 2", "Exit2");

    //Enable black background image gameObject.
    levelImage.SetActive(true);

    //Disable this GameManager.
    enabled = false;
}

//Coroutine to move enemies in sequence.
IEnumerator MoveEnemies()
{
    //While enemiesMoving is true player is unable to move.
    enemiesMoving = true;

    //Wait for turnDelay seconds, defaults to .1 (100 ms).
    yield return new WaitForSeconds(turnDelay);

    //If there are no enemies spawned (IE in first level):
    if (enemies.Count == 0)
    {
        //Wait for turnDelay seconds between moves, replaces delay caused by enemies moving when there are none.
        yield return new WaitForSeconds(turnDelay);
    }

    //Loop through List of Enemy objects.
    for (int i = 0; i < enemies.Count; i++)
    {
        //Call the MoveEnemy function of Enemy at index i in the enemies List.
        enemies[i].MoveEnemy();

        //Wait for Enemy's moveTime before moving next Enemy, 
        yield return new WaitForSeconds(enemies[i].moveTime);
    }
    //Once Enemies are done moving, set playersTurn to true so player can move.
    playersTurn = true;

    //Enemies are done moving, set enemiesMoving to false.
    enemiesMoving = false;
}

void Awake()
{
    // Get the buttons
    menuButtonList();
    //buttons = GetComponentsInChildren<Button>();

    // Disable them
    HideButtons();
}

public void HideButtons()
{
    foreach (var Button in buttons)
    {
        Button.gameObject.SetActive(false);
    }
}

public void LoadByIndex(int sceneIndex)
{
    SceneManager.LoadScene(sceneIndex);
}

public void Quit()
{
#if UNITY_EDITOR
    UnityEditor.EditorApplication.isPlaying = false;
#else
    Application.Quit();
#endif
}

我只想在我的GameManager脚本中GameOver下调用函数调用两个按钮出现在游戏中已定义的内容请检查GameManager中的行。 -194和所有Exit2

1 个答案:

答案 0 :(得分:2)

首先你需要一个Canvas。然后在画布中创建两个按钮。在GameManager脚本中引用此画布的实例。

游戏开始时通过.SetActive(false)取消激活,然后当GameOver通过.SetActive(true)发生时再次激活它。

向GameManager脚本添加2个方法,一个用于Exit,另一个用于MainMenu。并且让您创建的两个按钮的OnClick事件触发这两种方法。