C # unity преобразует повторяющееся число в число с диапазоном, основанное на количестве кликов

#c# #loops #unity3d #iteration

#c# #циклы #unity3d #итерация

Вопрос:

Я пытаюсь получить число от 0 до 3. Я пытаюсь выполнить итерацию по счетчику, и каждые 5 нажатий на кнопку он вызывает метод, но, похоже, я не могу его понять. Я пробовал разные способы сделать это. Если бы я мог получить несколько советов о том, как это сделать, пожалуйста, дайте мне знать. Если вам нужна какая-либо другая информация, также дайте мне знать. Спасибо!

 using UnityEngine;
using UnityEngine.UI;
using System;
using System.Threading;

public class ButtonClick : MonoBehaviour {

    private Vector3 starPos;
    private int starCounter;
    private int[] starTypes;
    private int totalStarTypes = 4;

    public Button button;
    public UnityEngine.UI.Text starCounterText;

    private Image starImage;

    // Use this for initialization
    void Start () {
        starTypes = new int[totalStarTypes];
    }

    void Update(){
        if (Input.GetMouseButtonDown (0)) {
            starCounter  ;
        }

        for (int i = 0; i < starCounter; i  ) {
            int j = i;
            int type = (j % 5);
            if (type == 0) {
                //SpawnStar (j%5);
            }
        }
    }

    // Update is called once per frame
    public void UpdateStar () {
        starCounterText.text = "Star Counter: "   starCounter;
    }

    public void SpawnStar(int type){
        if (type == 0) {
            Debug.Log ("White Star Spawned!");
        }
        if (type == 1) {
            Debug.Log ("Red Star Spawned!");
        }
        if (type == 2) {
            Debug.Log ("Yellow Star Spawned!");
        }
        if (type == 3) {
            Debug.Log ("Blue Star Spawned!");
        }
    }
}
  

Комментарии:

1. Что определяет, какая звезда появляется? Это тоже итеративно? Случайно? Какой-то другой определяющий фактор?

2. Для каждого клика счетчик добавляется на 1 (уже обработанный), и за каждые 5 кликов он порождает звезду. Итак, какое бы целое число ни обрабатывало логику 5-го клика (например, j или type, возможно, до сих пор не разработано), оно вызывает функцию для создания типа (int) star . Также я добавлю в него random, как только закончу с основами. На данный момент только итерация по счетчику, в которой обрабатывается логика, определяет, какой тип звезды порождается. Может быть, мне следует использовать like a List, выполнить итерацию по списку и получить из этого случайное значение int?

3. Вам не нужны списки, массивы или циклы. Это можно сделать с помощью простой математики. Помните принцип KISS.

Ответ №1:

 Random r = new Random();

void Update()
{
    if (Input.GetMouseButtonDown(0)) 
    {
        starCounter = (starCounter   1) % 5;
        if (starCounter == 0) SpawnStar(r.Next(0, 4));
    }
}
  

Ответ №2:

Ваш код будет отображать все звезды в каждом кадре после 5-го клика.

Попробуйте это, при нажатии появится одна звезда, и только та, которую вы хотели создать.

  • Int starCounter будет обрабатывать, какую звезду создавать
  • Bool executeSpawn будет обрабатывать, когда создавать звезду

 using UnityEngine;
using UnityEngine.UI;
using System;
using System.Threading;

public class ButtonClick : MonoBehaviour {

    private Vector3 starPos;
    private int starCounter;
    private bool executeSpawn;
    private int[] starTypes;
    private int totalStarTypes = 4;

    public Button button;
    public UnityEngine.UI.Text starCounterText;

    private Image starImage;

    // Use this for initialization
    void Start () {
        starTypes = new int[totalStarTypes];
    }

    void Update(){
        if (Input.GetMouseButtonDown (0)) {
            starCounter  ;
            executeSpawn = true;
        }

        if(executeSpawn) {
            SpawnStar (i % 5);
            executeSpawn = false;
        }
    }

    // Update is called once per frame
    public void UpdateStar () {
        starCounterText.text = "Star Counter: "   starCounter;
    }

    public void SpawnStar(int type){
        if (type == 0) {
            Debug.Log ("White Star Spawned!");
        }
        if (type == 1) {
            Debug.Log ("Red Star Spawned!");
        }
        if (type == 2) {
            Debug.Log ("Yellow Star Spawned!");
        }
        if (type == 3) {
            Debug.Log ("Blue Star Spawned!");
        }
    }
}
  

Комментарии:

1. Правильно, глядя на то, что SpawnStar делает функция, казалось бы, это то, что требуется. Я отредактирую ответ, чтобы отразить это

2. Во-первых, в OP конкретно указано, что звездочка должна появляться при каждом 5-м клике. Во-вторых, этот код может вызываться SpawnStar с параметром 4, который ничего не сделает. В-третьих, если целью было создание звезды при каждом клике, логический флаг является избыточным.