Visitante!
Faça seu Login ou Registre-se!

Galeria de Jogos

[Unity] Ajuda com código 5 Respostas | 124 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Username

  • *
  • Mensagens: 28 Ouro: 4
    • RPG Maker XP
    • Ver perfil
    • E-mail
[Unity] Ajuda com código
Online: 31 Dez 2017, 16:39
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

Código: [Selecionar]
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.
« Última modificação: 31 Dez 2017, 17:29 por Corvo »

Germinal
  • *
  • Mensagens: 48 Ouro: 22
    • RPG Maker MV
    • Facebook
    • Ver perfil
    • E-mail
[Unity] Ajuda com código
Resposta 1 Online: 31 Dez 2017, 17:03
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.

Username

  • *
  • Mensagens: 28 Ouro: 4
    • RPG Maker XP
    • Ver perfil
    • E-mail
[Unity] Ajuda com código
Resposta 2 Online: 31 Dez 2017, 17:34
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.

« Última modificação: 31 Dez 2017, 18:23 por Corvo »

Alisson

  • *
  • Mensagens: 3004 Ouro: 2102

    Vencedor CRM Awards - Melhor Mapper Vencedor do Evento Invasão na Fábrica de Brinquedos Vencedor CRM Awards - Melhor Maker Participantes do Maps Together 2

  • See, I'm not slacking, I'm patrolling... really~
    • Unity
    • Facebook
    • Steam
    • Youtube
    • Ver perfil
    • E-mail
  • Dragon ScalesPhoenixEspada CRMBreaklance
[Unity] Ajuda com código
Resposta 3 Online: 31 Dez 2017, 19:48
Experimente utilizar uma expressão da seguinte maneira:
Código: [Selecionar]
map.OnClick += (x, y, mouseButton) => {
    // coisas aqui
};
Não lembro se OnClick é um Action ou delegate, todavia é melhor deixar o compilador decidir.




Username

  • *
  • Mensagens: 28 Ouro: 4
    • RPG Maker XP
    • Ver perfil
    • E-mail
[Unity] Ajuda com código
Resposta 4 Online: 31 Dez 2017, 20:10
Experimente utilizar uma expressão da seguinte maneira:
Código: [Selecionar]
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):
Código: [Selecionar]
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:
Código: [Selecionar]
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?
Código: [Selecionar]
map.OnClick += ClickOnMap;
Obrigado.
« Última modificação: 31 Dez 2017, 20:56 por Corvo »

Alisson

  • *
  • Mensagens: 3004 Ouro: 2102

    Vencedor CRM Awards - Melhor Mapper Vencedor do Evento Invasão na Fábrica de Brinquedos Vencedor CRM Awards - Melhor Maker Participantes do Maps Together 2

  • See, I'm not slacking, I'm patrolling... really~
    • Unity
    • Facebook
    • Steam
    • Youtube
    • Ver perfil
    • E-mail
  • Dragon ScalesPhoenixEspada CRMBreaklance
[Unity] Ajuda com código
Resposta 5 Online: 01 Jan 2018, 02:18
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.




 

Versão Mobile