Tengo la tarea de crear un servidor (que usa Elixir y Merigo SDE) para un juego de Unity.
Por ahora, me conformo con enviar datos desde Unity (C#), lo cual hago de la siguiente manera:
public class ShotController : MonoBehaviour { public ConnectionHandler conHandler; public void Shoot(Vector3 direction, float power) { DataToSend data = new DataToSend(); data.power = power; data.direction_x = direction.x; data.direction_y = direction.y; conHandler.SendShotDetails(data); } } public class DataToSend { public float power = 0; public float direction_x = 0; public float direction_y = 0; } public class ConnectionHandler : MonoBehaviour, Playground.App.IPlaygroundDelegate { public void SendShotDetails<T>(T data) where T : class { Debug.Log("Shot!"); Playground.App.Manager.LocalGame.ScriptRequest("test_action", data); } }
Por el lado de merigo, tengo esto:
# Test receive request def doRequest("test_action", args) do # Read the player data Sys.Log.debug("Test action fired... #{inspect args}") %{:results => "success"} end
Ahora, salvo por algunos errores con Unity, el lado de Elixir sí funciona; muestra lo siguiente:
Acción de prueba activada... %{"direction_x" => 0,9692893624305725, "direction_y" => 0,0, "power" => 12,293679237365723}
Pero no tengo idea de cómo obtener esos valores de args y devolverlos. args.power
no funcionó.
¿Hay algo más que pueda probar?
Su mapa tiene sus claves como cadenas , también conocidas como binarios . La notación de puntos funciona para mapas si y solo las claves son átomos.
Tienes dos opciones.
Acceda al valor a través Access
map = %{"direction_x" => 0.9692893624305725, "direction_y" => 0.0, "power" => 12.293679237365723 } map["power"] #⇒ 12.293679237365723
O, alternativamente, haga coincidir el patrón directamente en la cláusula de función
def do_request("test_action", %{"power" => power}) do Sys.Log.debug("power is #{power}") end
o, desestructurarlo:
def do_request("test_action", args) do %{"power" => power} = args Sys.Log.debug("power is #{power}") end
Notas al margen: por convención, las funciones en elixir se nombran en notación de guión bajo ( do_request
en lugar de doRequest
) y cuando las claves del mapa son átomos, usamos una notación más corta con dos puntos :
(en lugar de %{:results => "success"}
do %{results: "success"}
.)