O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[Unity] Ajuda com código

Iniciado por Username, 31/12/2017 às 16:39

31/12/2017 às 16:39 Última edição: 17/05/2018 às 13:54 por Corvo
Olá,

Estou com uma dúvida em um código que peguei na internet. O código é do fabricante do asset que estou usando, e eu suponho que tenha erro, ou esteja incompleto.

O código do fabricante pode ser visto aqui: http://kronnect.me/taptapgo/index.php/topic,2623.0.html

void Start () {
        map = WMSK.instance;
        map.OnClick += ClickOnMap(10f,10f,10);
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    void ClickOnMap(float x, float y, int mouseButton)
    {
        Vector2 mapPosition = new Vector2(x, y);

        if (tank == null)
        {
            CreateTank(mapPosition);
        }
        else
        {
            // Try to move tank over this position
            bool tankMoves;
            tankMoves = tank.MoveTo(mapPosition, 100f);
            if(!tankMoves)
            {
                Debug.Log("Tank cannot move over there: too far or invalid terrain type.");
            }
        }
    }


A dúvida é o seguinte. Ele faz uma referência a "ClickOnMap":  "map.OnClick += ClickOnMap(10f,10f,10);" e esta função "ClickOnMap" retorna um "void": "void ClickOnMap(float x, float y, int mouseButton)".

Porque ele está associando esta função "ClickOnMap" ao evento OnClick? A função "ClickOnMap" não retorna "void"?

O que significa esta associação então "+=" ?

Ele não consegue associar o tipo OnClick pois retorna "void". É isso o que o compilador alega. Já tentei retornar de tudo aqui e não funciona de jeito nenhum.

Erro no OnClick:




(Só pra mencionar, postei no fórum de suporte deles pra ver se me ajudam também).

Obrigado.

To meio enferrujado, mas acho que o problema são esses parâmetros (10f,10f,10), eles vieram de onde? Você que colocou? No código do fabricante ele não ta executando o método e passando o resultado, ele ta passando o método em si pruma variável, por isso não tem os parametros. Ele ta falando que o evento de onClick vai chamar esse método novo (ClickOnMap). Não sei direito como ta o código aí, mas eu tirava os parâmetros e via o que acontecia, pode ser só esse o problema.

31/12/2017 às 17:34 #2 Última edição: 31/12/2017 às 18:23 por Corvo
Eu que coloquei nos meus testes aqui. Mas acho que é proibido neh, pelo que percebi e entendi.

Acho que ele esta executando o método mas parece que "está tendo problemas" para "achar a versão da função certa". Essa é a impressão.

Imagem:



Obrigado pela ajuda.


Eu fiz o seguinte. Tirei o método "OnClick" que pega as coordenadas x e y do clique do botão e passei um valor direto "ClickOnMap(x,y,button)".

Imagem:


Desse jeito compilou o código. Então associei o script ao objeto mas não aconteceu nada...não mudou nada.

Obrigado.


Experimente utilizar uma expressão da seguinte maneira:
map.OnClick += (x, y, mouseButton) => {
    // coisas aqui
};

Não lembro se OnClick é um Action ou delegate, todavia é melhor deixar o compilador decidir.

31/12/2017 às 20:10 #4 Última edição: 31/12/2017 às 20:56 por Corvo
Citação de: Alisson online 31/12/2017 às 19:48
Experimente utilizar uma expressão da seguinte maneira:
map.OnClick += (x, y, mouseButton) => {
    // coisas aqui
};

Não lembro se OnClick é um Action ou delegate, todavia é melhor deixar o compilador decidir.


Não entendi muito bem como fazer. Eu preciso chamar uma função, e neste código não está chamando a função.

Está assim o código...mas tive que tirar 1 argumento(o argumento do mouse). Porque o OnClick retorna o X e Y da posição do Mouse.

Está compilando mas está meio bugado ainda.

Imagem (//map.OnClick += ClickOnMap; // Esta linha não esta comentada no meu código):



Código (//map.OnClick += ClickOnMap; // Esta linha não esta comentada no meu código):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// Código WMSK
// using UnityEngine already included
using WorldMapStrategyKit;

public class createAndMoveUnit : MonoBehaviour
{

    WMSK map;

    public GameObject CompleteTank;

    GameObjectAnimator tank;

    // Use this for initialization
    void Start()
    {
        map = WMSK.instance;
        //map.OnClick += ClickOnMap;
        //ClickOnMap(0,0,1);
    }

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

    }

    void ClickOnMap(float x, float y)
    {
        Vector2 mapPosition = new Vector2(x, y);

        if (tank == null)
        {
            CreateTank(mapPosition);
        }
        else
        {
            // Try to move tank over this position
            bool tankMoves;
            tankMoves = tank.MoveTo(mapPosition, 100f);
            if (!tankMoves)
            {
                Debug.Log("Tank cannot move over there: too far or invalid terrain type.");
            }
        }
    }

    void CreateTank(Vector2 mapPosition)
    {
        if (map.ContainsWater(mapPosition))
        {
            Debug.Log("Position contains water.");
            return;
        }

        // Create unit on that position
        GameObject tankGO = Instantiate(CompleteTank);
        tankGO.transform.localScale = Misc.Vector3one * 0.25f;

        // Put tank on map position
        tank = tankGO.WMSK_MoveTo(mapPosition);

        // Make tank rotate automatically when it moves
        tank.autoRotation = true;

        // Tank cannot move over water
        tank.terrainCapability = TERRAIN_CAPABILITY.OnlyGround;

        // Move camera over the tank
        map.FlyToLocation(mapPosition, 2f, 0.1f);
    }
}


Vou tentar algo aqui.

Obrigado pela ajuda.


Alisson, eu tentei o que me passou e o compilador esta dizendo que o "Delegado OnClick  não aceita 3 argumentos".

Então a questão é, como passar 3 argumentos (x,y e mouseButton) para a função "ClickOnMap"?


Código

Função que recebe os argumentos:
void ClickOnMap(float x, float y, int mouseButton)
 {
}


Chamada que passa os argumentos. Porém OnClick passa somente o X e Y. Como passar o 3° argumento?
map.OnClick += ClickOnMap;


Obrigado.

O exemplo que eu passei é o que chamamos de Método Anônimo, mais especificamente Expressão Lambda. Eu recomendo que dê uma olhada nisso, entender como funciona pode solucionar esse e outros problemas que tu pode encontrar. Alá.

Então o problema é que ele não aceita o terceiro argumento, simplesmente por não haver um overload no evento.
Uma boa ideia seria guardar o terceiro argumento em uma propriedade de acesso global (assim como a posição do mouse pode ser obtida globalmente), como static, ou criar seu próprio EventHandler, mas novamente não lembro se ele é um delegate ou Action.