Jump to content
Unity Insider Forum

FluuuxTechBlog

Members
  • Content Count

    76
  • Joined

  • Last visited

  • Days Won

    1

FluuuxTechBlog last won the day on May 9 2014

FluuuxTechBlog had the most liked content!

Community Reputation

6 Neutral

About FluuuxTechBlog

  • Rank
    Advanced Member
  • Birthday June 30

Contact Methods

  • Website URL
    http://fluuux.de

Profile Information

  • Gender
    Male
  • Location
    München
  • Interests
    Hobbyprogrammierer, Webdesigner, Grafiker, Mac-User, Technikbegeistert, Sportler, Künstler, Blogger, Screencaster
  1. Dies ist mein zweiter Beitrag in dem es um die Interaktion zwischen Arduino und Unity3D gehen wird. Ich möchte zeigen wie man die Helligkeit einer Lichtquelle in Unity3D mit der Umgebungshelligkeit in der "realen" Welt synchronisieren kann. Wenn Sie Ihr Arduino Board mit dem Helligkeitssensor vor das Fenster stellen, die Rollläden geschlossen sind und Sie die ganze Nacht am zocken sind, dann werden Sie an der Umgebungshelligkeit im Spiel erkennen wann die Sonne aufgeht. Genauso könnten Sie im Spiel erkennen, wenn am Tag jemand am Fenster vorbei läuft (Je nachdem in welcher Etage Sie wohnen). ;-) Einleitung Während ich heute den Unity Asset-Store nach neuen interessanten Assets durchstöberte, bin ich auf ein super Video auf YouTube gestoßen, das meiner Vorstellung von einem Game der Zukunft schon ganz nahe kommt. Die meisten Spiele sind statisch ohne Einflussnahme auf die reale Welt. Stellen Sie sich vor, Sie spielen ein Aktion- oder Horrorspiel, in dem Lichter flackern, sich Ventilatoren drehen oder dem Spieler Wasser entgegen spritzt. Jetzt stellen Sie sich vor welche Aufwertung der Atmosphäre es bringen würde, wenn plötzlich auch die Lichter in Ihrem Zimmer zu flackern beginnen würden oder wenn Ihnen der Wind des sich im Spiel drehenden Ventilators in der realen Welt um die Nase wehen würde. Oder wie gespenstig wäre es, wenn Ihr Spieler durch einen modrigen, dunklen Keller wandelt in dem das Wasser von der Decke tropft und Sie die feuchte Luft hautnah spüren könnten. In diesem Beitrag möchte ich nun meine ersten Gehversuche mit diesem Asset zeigen. Ich werde für dieses Beispiel einen Arduino Uno verwenden, an dem ich lediglich einen Helligkeitssensor am analogen Pin 0 angeschlossen habe. Man könnte dieses Beispiel sicher auch ohne das Unity3D Asset “UNIDUINOâ€, das man für 30 USD im Asset Store kaufen kann, nachbauen, jedoch habe ich mich zum Kauf des Assets entschieden da dieses für einen reibungslosen Verbindungsaufbau zum Arduino über den Seriellen Port sorgt, was sonst ohne größere Probleme auf dem Mac wohl noch nicht möglich wäre. Folgendes wird benötigt 1 x Arduino-Board 1 x Helligkeitssensor 1 x Widerstand 1 paar Kabel Arduino Schaltungsaufbau Verbinden der Fotodiode und des Widerstandes mit dem Arduino Sketch Hier wird es uns leicht gemacht denn wir müssen kein eigenes Sketch schreiben. Es muss lediglich das Sketch “Firmata->StandardFirmata†aus den Beispielen geöffnet und anschließend auf das Board geladen werden. Unity3D Legen Sie ein neues Projekt in Unity3D an. UNIDUINO downloaden UNIDUINO ist ein Tool, dass Sie im Unity3D Asset-Store kaufen können. Benutzen Sie bitte folgenden Link oder suchen Sie im Asset Store nach UNIDUINO. UNIDUINO installieren Nachdem Sie UNIDUINO gekauft und heruntergeladen haben, werden Sie gefragt ob Sie dieses Asset in Ihr Projekt importieren wollen. Bestätigen Sie dies. Wenn jetzt, wie auf der folgenden Grafik, Fehler den Port betreffend in der Konsole angezeigt werden, gehen Sie im Menü auf “File->Build Settings->Player->Settings†und wählen Sie unter “Optimization†.NET 2.0 aus. Sollten Sie auf dem Mac programmieren und UNIDUINO das erste mal installieren, müssen Sie unter Umständen noch einen weiteren Schritt ausführen. Beenden Sie in diesem Fall Unity3D und gehen Sie in Ihrem Projektverzeichnis in den Ordner “Assets->Uniduino->UniduinoTestPanelâ€. Starten Sie die Datei “UniduinoTestPanel.unityâ€. Beantworten Sie die nun erscheinende Abfrage ob Sie den Treiber für den Seriellen Port installieren wollen mit Ja. Starten Se Unity3D neu. Der Fehler sollte nun nicht mehr angezeigt werden. Drücken Sie oben auf den Play-Button um das Projekt zu starten. Das Uniduino TestPanel sollte nun sichtbar sein. Wenn die Verbindung zum Arduino nicht selbstständig hergestellt wurde, klicken Sie bitte auf “Connectâ€. In diesem TestPanel können Sie nun ganz leicht die einzelnen Pins testen. Der Arduino Uno hat z.B. eine eingebaute LED die mit dem digitalen Pin13 verbunden ist. Um nun zu testen ob diese ein- und ausgeschaltet werden kann, klicken Sie im TestPanel hinter D13 auf den Button “OUTPUT†und anschließend auf den Button “DIGITALâ€. Nun können Sie in der Spalte OUTPUT auf den Button klicken um die LED ein oder auszuschalten. Wenn dies funktioniert, stoppen Sie das Projekt und löschen Sie das Objekt â€UniduinoTestPanel†aus dem Hierarchy-Fenster. Umgebung In diesem Beispiel reichen uns lediglich ein leeres GameObjekt für die Arduino Logik, ein Boden (Cube) und eine Lichtquelle (Directional Light). Klicken Sie im Menü auf “GameObject->Create Empty†und geben Sie diesem Objekt einen Namen. Ich habe das Objekt “ArduinoLogic†benannt. Machen Sie nun einen RechtsKlick im Project Fenster auf “Assets†und legen Sie einen neuen Ordner mit dem Namen “Scripts†und in diesem Ordner ein neues C# Script mit dem Namen “LightIntensity†an. Wählen Sie im Hierarchy Fenster das Objekt ArduinoLogic und ziehen Sie im das Script LightIntensity anschließend in den Inspector. Legen Sie eine Lichtquelle an in dem Sie im Menü auf “GameObject->Create Other->Directional Light†klicken. Nennen Sie dieses Objekt “Sonneâ€. Nun wählen Sie im Hierarchy Fenster erneut das Objekt “ArduinoLogic†und ziehen das Objekt “Sonne†in den Inspector auf “Sunlightâ€. Legen Sei einen Cube an und ändern Sie die Größe so dass dieser als Boden genutzt werden kann. Platziere Sie das Directional Light so dass dieses auf den Boden strahlt. C# Script – LightIntensity Das folgende Script, das dem Objekt “ArduinoLogic†zugewiesen wurde, stellt eine Verbindung zum Arduino her und ließt ständig den analogen Wert von AnalogPin0 aus. Dieser Wert, der durch den Helligkeitssensor erzeugt wird, wird nun der Variablen “Intensity†des “Directional Light†zugewiesen so das sich die Intensität des Directional Light je nach Helligkeitswerte in der Umgebung des Arduino Boards, ständig ändert. using UnityEngine; using System.Collections; using Uniduino; public class LightIntensity : MonoBehaviour { public Arduino arduino; public GameObject Sunlight; private float lightScale; void Start () { arduino = Arduino.global; arduino.Setup(ConfigurePins); } void Update () { } void FixedUpdate () { lightScale = Mathf.Round(arduino.analogRead(0)); arduino.reportAnalog(0,1); Sunlight.light.intensity = lightScale / 100; } void ConfigurePins(){ arduino.pinMode(9, PinMode.OUTPUT); } } Wenn Sie Ihr Projekt nun starten und die Hand vor den Helligkeitssensor am Arduino Board halten, sollte auch die Sonne in Ihrem Projekt dementsprechend weniger hell strahlen. Hinweis: Sie müssen UNIDUINO nicht kaufen, wenn Sie Windowsnutzer sind dann schauen Sie sich einfach mal mein anderes Unity3D Tutorial an. Alles was hier unter dem Punkt “Arduino†beschrieben ist. bleibt gleich. Sie müssten lediglich die Funktionen für den Verbindungsaufbau zum Arduino wie in meinem anderen Beitrag, selber managen. Ich hoffe Ihnen hat mein Tutorial gefallen. Bei Fragen oder Anregungen nutzen Sie bitte die Kommentarfunktion.
  2. Einen Beitrag zu uniduino habe ich in meinem Blog auch geschrieben (UNIDUINO – Helligkeit in Unity3D der Umgebungshelligkeit der realen Welt anpassen). Ist echt super was man damit machen kann. Falls es Dich interessiert, den Artikel kannst Du hier lesen. http://fluuux.de/2013/05/uniduino-helligkeit-in-unity3d-der-umgebungshelligkeit-der-realen-welt-anpassen/
  3. Das gibts doch nicht. trim kenne ich ja aus php nur habe ich nirgends Hinweise gefunden dass es das auch in Unity gibt. Mein Mono zeigt mir das auch nicht zur Auswahl an. Also ich habe es jetzt hinbekommen. Vielen Dank Sascha!!! var x = PlayerName.Trim(); if(x.Length > 0) { print("Spielername "+ x +" speichern"); PlayerPrefs.SetString("PlayerName", x); print("Level1 starten"); }
  4. Witzig, ich weiß wie man Google aufruft und nach etwas sucht. Alles was ich bis jetzt gefunden habe funktioniert aber nicht.
  5. Hallo kann mir jemand hier sagen, wie ich in JavaScript einen String überprüfe und die Leerzeichen am Anfang und am Ende des Strings entfernen kann? Vielen Dank
  6. Objekte in Unity über den COM-Port mit Arduino steuern Da ich wieder vermehrt mit Unity herum experimentiere und ich Arduino liebe, habe ich mir gedacht dass es doch interessant wäre, zu sehen, wie sich ein Objekt über Buttons am Arduino steuern lässt. Zusätzlich fände ich es schön, wenn bei einer Kollision meines Objekts in Unity mit einem anderen Objekt, eine LED am Arduino aufblinken würde. Heute möchte ich euch nun am Ergebnis meiner Experimente teilhaben lassen. Ziel meines Experiments ist es, die Kugel zwischen den zwei Würfeln mit den beiden Buttons am Arduino nach Links und Rechts zu bewegen. Wenn die Kugel mit dem linken Würfel kollidiert, soll eine LED am Arduino dreimal aufblinken. Bei einer Kollision der Kugel mit dem rechten Würfel, soll eine andere LED am Arduino fünfmal aufblinken. Die Datenübertragung vom Arduino an Unity und auch die Rückmeldungen von Unity an den Arduino werden über einen COM-Port der seriellen Schnittstelle geregelt. Arduino Aufbau der Steuerung für die Steuerung und die Kollisionsanzeige benötigen wir einen Arduino, ein Breadboard, zwei Buttons, 2 LEDs, 4 Widerstände und ein paar Kabel um das Ganze zu verbinden. Arduino Sketch Fangen wir also mit dem Arduino Sketch an, das folgendes tut. Ein Zeichen über die Serielle Schnittstelle senden wenn ein Button gedrückt wird. Darauf warten das Zeichen über die Serielle Schnittstelle empfangen werden und entsprechend mit dem Blinken einer LED darauf reagieren. /****************************************************************************** * Projekt: Daten über Seriellen Port an Unity senden und von Unity empfangen * * Autor: Enrico Sadlowski * * Erstellungsdatum: 27.03.2013 * * Letzte Aktualisierung: 28.03.2013 * * * * Beschreibung: * *-----------------------------------------------------------------------------* * Zeichen an Unity senden und von unity empfangen und entsprechend reagieren. * * Daten die an Unity gesendet werden, müssen durch Unity ausgewertet werden * * Daten die von Unity empfangen werden, müssen in Arduino ausgewertet werden. * * ******************************************************************************/ int inByte = 0; void setup() { Serial.begin(9600); pinMode(6, OUTPUT); pinMode(7, OUTPUT); } void loop() { // Zeichen an Unity senden if(digitalRead(8) == HIGH) // Button 1 wurde gedrückt sendCharToUnity(2); // Zeichen 2 an Unity senden if(digitalRead(9) == HIGH) // Button 2 wurde gedrückt sendCharToUnity(1); // Zeichen 1 an Unity senden //Zeichen von Unity empfangen if (Serial.available() > 0) // Daten werden empfangen { inByte = Serial.read(); // Zeichen vom Seriellen Port in inByte ablegen switch(inByte) // Abfrage welches Zeichen empfangen wurde { case 54: // Zeichen 6 von Unity empfangen sendCharToUnity(3); // Zeichen 3 an Unity senden und 10ms Pause blinkLEDandOff(6, 2); // led an Pin 6 zweimal aufblinken lassen break; case 55: // Zeichen 7 von Unity empfangen sendCharToUnity(4); // Zeichen 4 an Unity senden und 10ms Pause blinkLEDandOff(7, 2); // led an Pin 7 zweimal aufblinken lassen break; } } } /* LED blinken lassen led = pin an dem die LED hängt interval = Angabe wie oft die LED aufblinken soll */ void blinkLEDandOff(byte led, byte interval) { for(int i=0;i<interval;i++) { digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100); } } /* einzelnes Zeichen an Unity senden */ void sendCharToUnity(char Zeichen) { Serial.write(Zeichen); Serial.flush(); delay(10); } Unity In Unity habe ich einen Würfel mit den Abmessungen (X=50, Y=0,1 und Z=10) erstellt, der als Boden herhalten musste. Darauf habe ich zwei Würfel und eine Kugel in den Standardabmessungen erstellt. Diese Objekte habe ich mit etwas Abstand nebeneinander platziert, wobei die Kugel sich zwischen den Würfeln befindet und meinen steuerbaren Player darstellt. Damit sich alle 3 Objekte physikalisch korrekt verhalten wenn sich diese berühren, habe ich diesen jeweils einen Rigidbody zugewiesen. Ich möchte das LED1 am Arduino dann blinkt wenn meine Kugel einen der Würfel berührt. LEDs soll blinken wenn die Kugel mit dem anderen Würfel kollidiert. Damit ich die Kollision mit den verschiedenen Würfeln unterscheiden kann, habe ich zwei neue Tags mit den Namen “Blink6″ und “Blink7″ angelegt und jeweils eines der Tags den Würfeln zugeordnet. SerialPortTest.cs Als nächstes habe ich eine neue C Sharp Datei mit dem Namen “SerialPortTest.cs†angelegt. Diese Datei habe ich im Inspector der der Kugel zugewiesen. Dieses Script stellt beim starten eine Verbindung zum Seriellen COM-Port 3 her, mit dem auch der Arduino verbunden ist. Wenn Sie Ihr Unity-Projekt später ausführen wollen, beachten Sie bitte, dass Sie den Serial Monitor der Arduino Software nicht geöffnet haben, da sonst keine Verbindung zum COM-Port hergestellt werden kann, da diese in diesem Fall bereits geöffnet ist. In der Funktion “Update†wird nun ständig geprüft ob Werte über den Seriellen Port empfangen werden. Wenn Sie auf dem Arduino Button1 drücken, dann wird das Zeichen 1 empfangen und die Kugel bewegt sich nach rechts. Wenn die Kugel nun den Würfel mit dem Tag “Blink6″ berührt, wird eine Kollision erkannt und das Zeichen 6 wird an den Arduino gesendet. Der Arduino wiederum empfängt dieses Zeichen und reagiert darauf indem er LED 1 dreimal blinken lässt. Zusätzlich wird das Zeichen 3 zurück an Unity gesendet. Wie Sie nun auf diese Rückgabe reagieren bleibt Ihrer Fantasie überlassen. ich gebe hier lediglich eine Meldung aus. /****************************************************************************** * Projekt: Daten über Seriellen Port an Unity senden und von Unity empfangen * * Autor: Enrico Sadlowski * * Erstellungsdatum: 27.03.2013 * * Letzte Aktualisierung: 28.03.2013 * * * * Beschreibung: * *-----------------------------------------------------------------------------* * Zeichen über die serielle Schnittstelle empfangen um ein Objekt zu steuern * * Bei Kollision eines Objektes mit anderen Objekten ein Zeichen über die * * Serielle Schnittstelle an den Arduino senden und dort eine LED blinken * * lassen. * ******************************************************************************/ using UnityEngine; using System.Collections; using System.IO.Ports; public class SerialPortTest : MonoBehaviour { public float speed; private float amountToMove; private bool collides = false; SerialPort sp = new SerialPort("COM3", 9600); void Start () { OpenConnection(); speed = 10; } void Update() { amountToMove = speed * Time.deltaTime; if(sp.IsOpen) { try { //Daten vom Arduino empfangen //Objekt ueber Arduino steuern (1=links, 2=rechts) MoveObject(sp.ReadByte()); print(sp.ReadByte()); } catch (System.Exception) { } } } /* Player ist mit Objekt kollidiert */ void OnCollisionEnter(Collision col) { if(col.gameObject.tag == "Blink6") { collides = true; print ("collidiert"); SendDataToArduino("6"); } if(col.gameObject.tag == "Blink7") { collides = true; print ("collidiert"); SendDataToArduino("7"); } } /* Anwendung wird geschlossen */ void OnApplicationQuit() { sp.Close(); print ("COM-Port geschlossen"); } /* Mit COM-Port verbinden */ public void OpenConnection() { if (sp != null) { if (sp.IsOpen) { sp.Close(); print("COM-Port schliessen, weil er bereits geoeffnet war!"); } else { sp.Open(); // COM-Port Verbindung öffnen sp.ReadTimeout = 1; print("COM-Port geoeffnet!"); } } else { if (sp.IsOpen) print("COM-Port ist bereits geoeffnet!"); else print("Port == null"); } } /* Player über den Arduino steuern 1=links, 2=rechts */ void MoveObject(int Direction) { switch (Direction) { case 1: transform.Translate(Vector3.right * amountToMove, Space.World); break; case 2: transform.Translate(Vector3.left * amountToMove, Space.World); break; case 3: print("Ich habe nach der Kollision das Zeichen 3 vom Arduino empfangen"); break; case 4: print("Ich habe nach der Kollision das Zeichen 4 vom Arduino empfangen"); break; } } /* Daten an Arduino senden */ void SendDataToArduino(string Zeichen) { if(collides == true) { sp.WriteLine(Zeichen); collides = false; print (Zeichen + " wurde an Arduino gesendet"); } } } Ich hoffe ich konnte dem Einen oder Anderen mit diesem kleinen Tutorial etwas helfen. ich persönlich finde es einfach faszinierend, Objekte im Virtuellen Raum mit realen Objekten steuern zu können und auch noch Rückmeldungen aus dem Virtuellen Raum zu erhalten. Dieses Tutorial finden Sie übrigens auch in meinem FLUUUX-TechBlog
  7. Das versuche ich ja und so habe ich es bis jetzt auch immer gemacht
  8. Ich sehe die Grafik wenn ich das Spiel nicht gestartet habe, ja. Zum auf die Kamera schauen müsste doch das hier reichen oder? var Target : Transform; function Update () { transform.LookAt(Target); } Da übergebe ich als Target die kamera
  9. Ok habe ich so gemacht und ich habe in dem Script zum testen einfach mal die max und ist werte übergeben. Es wird trotzdem nichts gezeigt.
  10. Das versuche ich ja schon mit Debug.Log auszugeben. var relativePos: Vector3; relativePos = transform.position; Debug.Log(Physics.OverlapSphere(relativePos, 0.2, 0).GetValue); Da kommt aber nichts gescheites bei raus
  11. Vielen Dank Sascha. Jetzt muss ich mal sehen ob ich dazu was finde. Die unity3d Referenz kann man ja mal voll vergessen
  12. Hm, geht das so einfach? Normalerweise nehme ich ein Script was ich allen Gegnern geben kann und lasse das die treffer zählen und die Energie hoch oder runter zählen. Wenn ich das jetzt den Player selber machen lasse, funktioniert dass dann so einfach dass ich die Energie auch dem richtigen Gegner abziehen kann?
  13. Du meinst also dass ich in der funktion Update() immer abfragen soll ob eine Sphere mit dem Tag PlayerFaust in der Capsule (Körper des Enemy) steckt? habe ich das so richtig verstanden?
  14. Erst mal vielen Dank für Deine ausführliche Antwort. Also ich habe jetzt ein 0 Objekt erstellt und in dieses 2 GUI Texturen rein gepackt. Daraus habe ich ein Prefab erstellt und dieses als Unterobjekt meinem Charakter hinzugefügt. Position auf 0, 0, 0 und dieses dann über den Kopf gezogen. Das Script von Dir habe ich dem 0 Objekt hinzugefügt. das ist doch richtig oder? Die grafiken für Hintergrund und Energieanzeige habe ich den GUI Texturen vorher hinzugefügt und auch die Größen eingestellt. Leider wird rein gar nichts angezeigt. Ich habe noch kein Script zum ausrichten der Anzeige in Richtung Kamera. Aber ich dachte ich könnte schon mal was sehen.
×
×
  • Create New...