Alle Beiträge

  • Strengere Lizenz- und Profil-Anforderungen für AssetStore-Publisher

    Strengere Lizenz- und Profil-Anforderungen für AssetStore-Publisher

    Unitys AssetStore erfreut sich nach wie vor großer Beliebtheit, da er Entwicklern ermöglicht, mit dem Verkauf eigener Assets Geld zu verdienen. Entsprechend befindet sich der Shop und die dazugehörige Infrastruktur in stetiger Überarbeitung, Erweiterung und Verbesserung. Nun hat Unity wieder einige Änderungen bekannt gegeben, die die Produktaufbereitung wie auch die Selbstpräsentation der Publisher betrifft. Dieser Beitrag fasst die wichtigsten Punkte zusammen.

    Genauere Beschreibung von Bestandteilen Dritter

    Ich empfehle generell, möglichst ausschließlich eigene Inhalte im AssetStore zu veröffentlichen, um rechtliche Risiken von vorn herein zu minimieren. In manchen Fällen ist es für die Funktion des Assets aber erforderlich, Komponenten Dritter einzubauen. Hierfür hat Unity nun die Auszeichnungspflichten verschärft.

    Werden fremde Bestandteile wie z.B. Open-Source-Komponenten im eigenen Paket integriert, so verlangt Unity nun ausführlichere Dokumentationen der zugrundeliegenden Lizenztexte.

    • Lizenztext-Dateinamen: Statt dem bisherigen schlichten license.txt sollen die Lizenzdateinamen nun den Namen des betreffenden Bausteins beinhalten, z.B. FontLicense.txt. Die Datei muss im Ordner der Komponente gespeichert werden.
    • Neuer Zusammenfassungs-Text: Zudem muss eine Zusammenfassungsdatei im obersten Ordner des Pakets eingebunden werden. Diese Textdatei soll auf einen Blick beschreiben, welche fremden Komponenten im Paket enthalten sind und wie deren Lizenzierung aussieht. Unity gibt folgende Textvorlage dazu als Beispiel:
      Asset is governed by the Asset Store EULA; however, the following components are governed by the licenses indicated below:
      
      [name of component]
      
      [name of license; e.g., "MIT", "MIT/X11", "Apache 2.0"]
      
      [license and copyright/accreditation details—determined by relevant license]
      
      ...
    • Lizenz in Asset-Beschreibung: Dass eine fremde Komponente eingesetzt wird, muss nun zudem bereits aus der Beschreibung im AssetStore ersichtlich werden. Dazu ist ein Text wie folgender in die Beschreibung zu integrieren:
      Asset uses [name of component] under [name of license]; see Third-Party Notices.txt file in package for details

    Quelle: AssetStore Policy Updates

    Strengere Kontrolle bei Einsatz des Unity-Logos

    Wer sich bereits in der Vergangenheit an die Regeln gehalten hat, dürfte kein Problem damit haben, dass Unity nun strenger gegen den unrechtmäßigen Einsatz des Unity-Logos in AssetStore-Paketen vorgehen will. Die Verwendung des Unity-Logos in den Produktbildern wird in Zukunft Produkten vorbehalten sein, bei denen eine offizielle Geschäftsbeziehung mit Unity besteht.

    Quelle: AssetStore Policy Updates

    [kursbanner thema=“assetstore“]

    Höhere Anforderungen an das AssetStore-Publisher-Profil

    Unity hat schon mehrfach die Anforderungen an die Gestaltung der Publisher-Webseite im AssetStore erhöht. Nun wird erneut um eine Aktualisierung gebeten. Das Ziel ist dabei, dass das Profil auf den aktuellsten Stand gebracht wird und neue Erfahrungen, Fähigkeiten und Arbeiten der letzten 6 Monaten zu sehen sind. Es sollen außerdem mindestens 3 Projekte der letzten Zeit vorgestellt werden.

    Quelle: AssetStore Policy Updates

    Einbindung des Publisher-Profils in Unity Connect

    Scheinbar anlässlich der geänderten Datenschutzsituation („DSGVO“) arbeitet Unity nun verstärkt am Langzeitziel, alle Dienste und Konten unter einen Hut zu bringen. Bisher waren separate Konten, Profile und Logins für verschiedene Unity-Produkte und Dienste nötig. Die einzelnen Bestandteile sollen in Zukunft im zentralen Unity Connect-Profil zusammengefasst werden, so dass sich Zugriff und Verwaltung vereinfachen. Es besteht kein Handlungsbedarf, die Umstellung geschieht automatisch.

    Quelle: Unity Profile GDPR Updates

    AssetStore-Pläne für die nahe Zukunft

    Demnächst wird Unity folgende Änderungen einführen, die zum Teil auch AssetStore-Publisher betreffen:

    • Vereinfachte Teilnahme an Sale-Aktionen. Statt sich wie bisher manuell für spezielle Marketingaktionen bewerben zu müssen, soll ein neues Online-Werkzeug helfen, diesen Prozess zu vereinfachen.
    • Beschleunigung der Überprüfung. Durch neue Werkzeuge und die teilweise Automatisierung der Überprüfungsprozesse soll die Freigabe von eingereichten Assets beschleunigt werden. In den letzten Jahren stieg die Wartezeit von Einreichung bis Freigabe im Store teils auf bis zu mehreren Wochen an.
    • Verbesserte Suche. Neue Algorithmen sollen die Such-Ergebnisse für Käufer im AssetStore verbessern. Eine neue Suchfunktion soll außerdem den Überblick über bereits gekaufte Produkte verbessern.

    Quelle: Asset Store Enhancements – Improvements & new features

     

     

     

     

  • Frei verwendbare Musik von Chris Hülsbeck

    Frei verwendbare Musik von Chris Hülsbeck

    In einem neuen Patreon-Projekt bietet Chris Hülsbeck derzeit Soundtracks zur freien Nutzung in eigenen Projekten wie z.B. Spielen an. Eine Namensnennung ist erforderlich. Chris wurde vor allem zu Beginn der Computerspiel-Ära in den 1990er-Jahren für seine musikalische Arbeit an den damaligen Spielen bekannt. Seine Biografie umfasst die Arbeit an Projekten wie Star Wars Rogue Squadron Series, Turrican, Giana Sisters, Tunnel B1, Extreme Assault, War of the Worlds, Doctor Who: Legacy and Symphonic Shades und anderen.

    Auf seiner Seite Chris Huelsbeck is creating new music (now royalty-free) stellt er jetzt Musik-Titel lizenzfrei zur Verfügung. Das bedeutet, dass Du zum Beispiel die Titel auf Youtube, in Spielen oder in Präsentationen verwenden kannst, kostenlos und ohne Sorge um das Urheberrecht. Die Nutzung für kommerzielle Zwecke ist ausdrücklich erlaubt. Die Einschränkung ist, dass die Musik alleine nicht weiterverkauft werden darf, sondern im Projekt gebunden sein muss. Der Musiker freut sich außerdem, wenn er in den Credits genannt wird, damit sein Projekt bekannt wird.

    Zugriff auf die Sounddateien beginnt schon ab 1$, weniger als 1€.

    Patreon ist eine Crowdfunding-Plattform für digitale Inhalte, die nach einem Abonnement-Model funktioniert. Durch Zahlung eines von Dir selbst bestimmten Betrags kannst Du die Arbeit von Künstlern unterstützen und erhältst im Gegenzug exklusiven Zugriff auf die Arbeiten – in diesem Fall die Musik-Titel. In Chris‘ Projekt ist eine Mitgliedschaft bereits ab 1 USD (ca. 0,85 €) möglich. Auf der Membership-Seite kannst Du alle Angeboten ansehen und buchen. Übrigens: Wenn Du Dich entscheidest, dieses Projekt zu unterstützen, erhältst Du sofortigen Zugriff auf alle Musikstücke, also auch die, die schon früher veröffentlicht wurden.

    Eine Vorschau der Musik kannst Du übrigens auf dieser Soundcloud-Seite anhören.

    Vorschau einiger Tracks
  • DSGVO – jedes Unity-Spiel betroffen?

    DSGVO – jedes Unity-Spiel betroffen?

    Am 25. Mai 2018 trat die Datenschutzgrundverordnung (DSGVO) in Kraft. Sie stellt Regeln zur Verarbeitung personenbezogener Daten von EU-Bürgern auf und vereinheitlicht die Datenschutzregeln für mehr Klarheit und Transparenz. Auch dass die DSGVO bewirken soll, dass jeder Einzelne aktiv bestimmen kann, was/wann/wie/wo mit seinen persönlichen Daten geschieht, ist in der Grundidee eine gute Sache.

    Enormer Umsetzungsaufwand in der Praxis

    Aus Unternehmersicht ist die Regelung jedoch außerordentlich kompliziert und aufwändig umzusetzen. So habe Google um die 500 Jahre Arbeit in die Vorbereitung auf die neue Rechtslage investiert.

    Obwohl es ja auch in der Vergangenheit schon teils hohe Datenschutzregelungen gab, wird die Situation durch neue Anforderungen verschärft:

    • Die Schutzregeln richten sich nicht nach dem Sitz des Unternehmens, sondern nach dem Land des Dateneigentümers. Das heißt, sobald Daten von EU-Bürgern verarbeitet werden, greift die DSGVO. Daher sind Unternehmen in allen Ländern weltweit betroffen.
    • Einerseits ist nahezu jede Form von Datenerfassung potenziell problematisch, andererseits ist Datenaufzeichnung ganz normaler Bestandteil heutiger Technologien. Jeder einfache Webserver protokolliert z.B. Zugriffe und IP-Adressen, die als persönliche Daten angesehen werden können. Es ist also gut möglich, dass datenschutzrechtlich relevante Vorgänge in Deinem Projekt stattfinden, obwohl Du selbst gar keine Daten sammelst oder auswertest.
    • Du bist verantwortlich, auch für Deine Geschäftsbeziehungen. Wenn Du also z.B. Google Analytics einsetzt, bist Du dafür verantwortlich, dass sich die Datenverarbeitung von Google an die Rechtslage hält und alle Anforderungen erfüllt.
    • So gut wie alle Vorgänge bei denen Daten verarbeitet werden, müssen offengelegt und erklärt werden, wodurch sehr lange Rechtstexte entstehen, denen die Benutzer zustimmen müssen.
    • Die Regeln gelten für jeden, der Daten erfasst. Egal, ob es der Turnverein, ein Webseitenanbieter oder ein großer Internetkonzern ist. Daten werden nahezu überall verarbeitet. Es muss sich noch nichtmal um Nutzerverfolgung (Tracking) handeln. Jede Kundenkartei und sogar jede E-Mail ist theoretisch betroffen.
    • …und vieles mehr.

    DSGVO ist auch für Spieleentwickler relevant

    Wenn Du Spiele entwickelst, bist Du ebenfalls von der DSGVO betroffen. Selbst wenn Du ein Spiel ohne jegliche Online-Funktion (z.B. Auto-Update) und Datenaufzeichnung (z.B. User-Name) programmieren würdest, kämst Du spätestens bei der Veröffentlichung im Internet (Webseite, Online-Shop, usw.) mit personenbezogenen Daten in Berührung.

    Einziger Ausweg wäre möglicherweise ein Publisher, der das Spiel für Dich vertreibt. Dieser übernimmt dann alle datenschutzrelevanten Verpflichtungen, sofern Du rein als Entwickler im Hintergrund bleibst, Deine Technik keinerlei Daten erfasst und der Publisher komplett alle Aufgaben übernimmt, bei denen Daten verarbeitet werden (Webseite, Werbung, Newsletter, Vertrieb, Updates, usw.).

    Dein Unity-Spiel könnte betroffen sein

    Doch weißt Du überhaupt mit Sicherheit, dass Dein Spiel keine Daten sammelt? Der Teufel steckt hier im technischen Detail: Um nicht ständig das Rad neu erfinden zu müssen, verwendet man normalerweise Bibliotheken und Softwaremodule, also letztlich kurz gesagt eine GameEngine, um ein Spiel herzustellen. Du musst also sicherstellen, dass die Engine auch keine Daten sammelt.

    Mit der Unity-Engine erstellte Spiele sammeln grundsätzlich (aber nicht ständig) Daten und schicken sie über das Internet an den Hersteller.

    Nach Unitys Angaben zum Datenschutz werden folgende Informationen von Deinen Spielern erfasst:

    Unity has collected some or all of the following information about your device: unique device identifiers (e.g., IDFV for iOS devices and Android ID for Android devices); IP address; country of install (mapped from IP address); device manufacturer and model platform type (iOS, Android, Mac, Windows, etc.) and the operating system and version running on your system or device; language; CPU information such as model, the number of CPUs present, frequency, and instruction set support flags; the graphics card type and vendor name; graphics card driver name and version (e.g., “nv4disp.dll 6.10.93.71”); which graphics API is in use (e.g., “OpenGL 2.1” or “Direct3D 9.0c”); amount of system and video RAM present; current screen resolution; version of the Unity Editor used to create the game; sensor flags (e.g., device support for gyroscope, touch pressure or accelerometer); application or bundle identification (“app ID”) of the game installed; unique advertising identifiers provided for iOS and Android devices (e.g., IDFA or Android Ad ID); and a checksum of all the data that gets sent to verify that it transmitted correctly.

    Heikel könnte die Kombination aus Geräte-ID sowie der IP-Adresse sein, da sich Anwender damit eindeutig identifizieren lassen. Die IP wurde in der Vergangenheit ohnehin meist zu den persönlichen Daten gezählt, wenn es um Auslegung von Datenschutzregeln ging. Allerdings erklärt Unity auch, dass diese Daten in der Regel anonymisiert und zu statistischen Zwecken nicht-personenbezogen gespeichert werden. Das lässt hoffen, ebenso wie das Bemühen seitens Unity, die DSGVO-Konformität für alle Beteiligten so einfach wie möglich umzusetzen.

    Unitys Datenerfassung ist übrigens nicht neu, sondern besteht schon eine Weile. Mit den verschärften Datenschutzregelungen gewinnt diese Situation aber an Bedeutung, zumal Du als Spiele-Hersteller ja für die von Deinem Produkt (auch über Module Dritter) gesammelten Daten verantwortlich bist.

    Update: Mittlerweile hat Unity ein Plugin im AssetStore online gestellt, mit dem sich ein Button ins Spiel integrieren lässt, der den Spieler zu einer Webseite mit Datenschutz-Infos und einer Anonymisierungs-Option führt.

    Dauer-Nervthemen Analytics und Ads

    Etwas komplizierter wird es, wenn Du in Deinem Spiel Analysen, Werbung und andere Dienste mit hohem Interesse an möglichst persönlichen Daten integrierst. Bereits beim Einsatz von Google Analytics auf Webseiten ist die datenschutzrechtliche Situation seit Jahren kompliziert und relativ umständlich umzusetzen. Unity bietet mit Unity Analytics ein Werkzeug an, das Entwicklern aufschlussreiches Feedback über Technik und Spielereignisse liefert. Doch entstehen durch die Datenerfassung höhere Anforderungen an den Datenschutz.

    Zu den von Unity Analytics erfassten Daten gehören:

    If a game developer or publisher enables Unity Ads or Unity Analytics for their game, we collect data such as device type, country, device language, in-game behavior and purchases, IP address, Apple’s Advertising Identifier (IDFA), and Google Play advertising ID. This information helps developers and publishers tailor games and ads for players and their devices, such as providing ads designed for specific device types, player languages, and game preferences.

    Weiter heißt es, dass diese Informationen genutzt werden, um zielgerichtete Produkte und Werbung auszuliefern. Entwickler können seit 25. Mai 2018 ein aktualisiertes SDK für die Einbindung des Werbesystems Unity Ads nutzen, mit dem es den Spielern möglich sein soll, sich aus der Datenerfassung auszutragen.

    Bibliotheken Dritter auf Konformität prüfen!

    Es gibt noch weitere Anbieter für die Integration von Analyse- oder Werbe-Diensten. Auch diese sind jeweils hinsichtlich der Rechtskonformität und ggf. für Entwickler notwendige Schritte zu untersuchen. Möglicherweise müssen z.B. Zustimmungen der Spieler eingeholt werden, damit das Modul zum Einsatz kommen kann.

    Ein Aspekt der DSGVO sieht vor, dass Daten erhoben werden dürfen, wenn ein „berechtigtes Interesse“ besteht. Es geht dabei scheinbar darum, dass nicht willkürlich Daten im großen Stil gesammelt werden, sondern dass die Daten auch wirklich gebraucht werden. Unity greift diesen Punkt auf, um sich (und letztlich uns Entwickler) weiter abzusichern:

    Unity is SDKs, it’s plugins, and it’s the engine itself. So, Unity’s profiling is compatible with other, more legitimate interests than merely ads. Crash reports, bug fixes, enabling user-user communication, etc., are each of legitimate interest to our gamers and developers. Our profiling enables those purposes. Unity is in a unique position because our profiling is compatible to those legitimate interests.

    Dadurch dass Unity aus einer Komposition von Entwicklungssystemen, Plugins und der eigentlichen GameEngine besteht, gehe der Nutzen der Datensammlung über das zuschneiden von Werbung hinaus. Auch Fehleranalyse und -behebung sieht Unity Technologies als berechtigtes Interesse von Spielern und Entwicklern. Wegen diesem Zusammenspiel sei Unity in einer besonderen Stellung, die z.B. bei der Datenerfassung von anderen, externen Diensten nicht gegeben ist.

    Was tun?

    Was jetzt zu tun ist, hängt vom Einzelfall ab und muss individuell, ggf. mit Hilfe einer Rechtsberatung, ausgearbeitet werden.

    Einige Gedanken und Anregungen für erste Schritte:

    1. Analysiere Dein Produkt und finde heraus, wann und wo Daten von Dir oder Dritten erfasst werden.
    2. Frage Dich, ob es wirklich nötig ist, Daten zu erfassen. Falls nicht, kann es die Sache enorm vereinfachen, auf die Datenerfassung schlichtweg zu verzichten! Bedenke, dass die Umsetzung der DSGVO nicht nur die Erstellung der Datenschutzerklärung bedeutet, sondern dass den Nutzern nun ausgiebige Auskunfts- und Löschungsrechte zustehen.
    3. Lies Dir Ratgeber zum Thema DSGVO durch, um die Details zu verstehen (z.B. Überblick bei e-recht24). Es werden mittlerweile zahlreiche Checklisten (meist für Webseiten) angeboten, mithilfe derer man auch an Dinge erinnert wird, die man sonst schnell übersehen könnte.
    4. Erstelle eine Datenschutzerklärung für Deine Spieler. Evtl. kann ein Datenschutzgenerator (z.B. hier) helfen, die korrekten Texte und erforderlichen Angaben zu erzeugen. Wenn Du Plattformen (z.B. Steam) oder Bibliotheken/Engines (z.B. Unity) verwendest, kann ein Hinweis mit Link zu den jeweiligen Datenschutzerklärungen erforderlicher Bestandteil Deiner Datenschutzerklärung sein.
    5. Wenn eine Zustimmung zur Datenerfassung erforderlich ist, dann kann es nötig sein, diese in der Software einzuholen. Im Zweifelsfall muss die Art und der Zeitpunkt der Zustimmung protokolliert und nachgewiesen werden können. Manche Vertriebsplattformen, wie z.B. Google Play, verlangen die Angabe einer URL oder Upload der Datenschutzerklärung bereits für die Darstellung des Produkts im Online-Shop.

    Zusammenfassung

    • Wenn Du ein Spiel nach normalem Stand der heutigen Technik entwickelst und veröffentlichst, ist die DSGVO für Dich als Anbieter relevant.
    • Mit Unity erstellte Spiele erfassen Geräte- und Nutzerdaten, die zu Unity Technologies (vermutlich in die USA) übertragen und dort angeblich anonymisiert verarbeitet werden.
    • Unity Technologies ist sehr bemüht, die gesamte Technik für alle Beteiligten möglichst einfach DSGVO-konform zu machen und hat seine Dienste wie z.B. Ads und Analytics entsprechend angepasst. Ein Plugin für einen Datenschutz-Button ist jetzt im AssetStore kostenlos erhältlich.
    • Datenschutzerklärungen und Auskünfte über die Datenerfassung seitens Unity finden sich hier: Aktualisierte Privacy Policy und Unity Statement on GDPR Readiness
    • Prüfe, welche Daten in Deinem Projekt erfasst werden und welche Umsetzungen der Datenschutzregeln erforderlich sind.

     

    [disclaimer_rechtsthemen]

     

  • Wie Farbe im GameDesign wirkt

    Wie Farbe im GameDesign wirkt

    Ich habe heute 7 neue Videos mit ca. 50 Minuten Laufzeit in den Kurs „Kreativität und Ideenfindung für Spiele-Entwickler“ hochgeladen, in denen ich das Thema Farbe ausführlich bespreche.

    Die neuen Inhalte umfassen:

    • Einführung zur Bedeutung von Farbe
    • Hintergründe zur Wirkung von Farbeindrücken
    • Farb-Codes und wie sie im Gamedesign eingesetzt werden können
    • Bearbeitbare Eigenschaften zur Gestaltung von Farben
    • Bedeutung und Entwicklung von Kontrasten für Spiele
    • Anleitung, um ein Farbschema zu entwickeln
    • Inspirationen für das Finden von Farbpaletten fürs Gamedesign

    Für alle bereits eingeschriebenen Teilnehmer ist dieses Update kostenlos.
    Noch nicht eingeschrieben? Verwende einen Rabatt-Link auf der Kurs-Seite.

    Viel Spaß!

  • Modell-Rückseiten in Unity anzeigen

    Modell-Rückseiten in Unity anzeigen

    Unity – und eigentlich auch alle anderen Echtzeit-GameEngines – zeichnen normalerweise nur die Vorderseite von 3D-Objekten (Faces), da man davon ausgehen kann, dass für die Mehrheit aller Objekte nur die Außenseiten sichtbar sind. Würde man grundsätzlich immer beidseitig rendern, würde das den doppelten Rechenaufwand bedeuten, weshalb diese Optimierung grundsätzlich durchaus Sinn macht. In einigen Fällen kann es aber durchaus erforderlich sein, die Modelloberflächen doppelseitig (Double Sided) zu zeichnen, zum Beispiel bei den Blättern einer Pflanze.

    Problem: Die Blatt-Unterseiten werden nicht dargestellt.

    Eine Lösung für das Problem besteht darin, einen speziellen Shader in Unity zu verwenden, der doppelseitig rendert. Dieser Beitrag beschreibt, welche Schritte nötig sind, um Double Sided Shader aus dem Unity-AssetStore zu laden und im Projekt anzuwenden.

    Lösungsweg

    Lade das kostenlose Asset-Paket Double Sided Shaders aus dem AssetStore

    1. Öffne den AssetStore in Unity und suche nach „Double Sided Shaders“.
    2. Es gibt zwei Versionen, finde die kostenlose Version (oder kaufe die Pro-Version).
      Direktlink: https://www.assetstore.unity3d.com/en/#!/content/23087
    3. Klicke auf Download und dann auf Import, um das Asset zu Deinem Projekt hinzuzufügen.
    4. Du kannst das AssetStore-Fenster schließen.

    Stelle das Material auf den Shader um

    1. Wähle Dein Material-Asset im Project-Fenster aus.
    2. Wähle in der Auswahlliste „Shader“ im Inspector den Eintrag Ciconia Studio > Double Sided > Transparent  > Diffuse Bump Cutout.
      Je nach Anwendungsfall kann auch ein anderer Shader nützlich sein. Wenn Du keine Transparenz brauchst, solltest Du z.B. einen Eintrag aus dem Standard-Menü wählen.

    Ergebnis

    Das Modell wird nun von beiden Seiten gezeichnet:

    Farn-Modell mit doppelseitigem Material

    Eine Alternative ist die doppelseitige Modellierung, das heißt sowohl die obere als auch die untere Fläche des Blattes muss im Mesh modelliert werden. Wenn die Normalen der Flächen entsprechend nach außen (d.h. für die Oberseite nach oben und die Unterseite nach unten) zeigen, entsteht eine doppelseitige Darstellung. Dieser Weg funktioniert für alle Materialien, ist aber aufwändig in Erstellung und weiterer Verarbeitung (z.B. bei Animation).

    Zusammenfassung

    Meshes werden normalerweise nur einseitig gezeichnet, um den Rechenaufwand gering zu halten. In Sonderfällen, wie z.B. bei den Blättern einer Pflanze, muss man selbst abwägen, ob das doppelseitige Berechnen grafisch erforderlich ist und die zusätzliche Rechenlast rechtfertigt. Im Beispiel des Farns könnte einseitiges Rendern genügen, wenn er auf dem Boden wächst und man von der Kameraperspektive so gut wie immer nur von oben darauf schaut. Sieht man ihn jedoch seitlich, kann es dagegen erforderlich sein, für eine doppelseitige Darstellung zu sorgen.

     

  • ScriptableObjects und Inventar: über 2 Stunden neue Videos

    ScriptableObjects und Inventar: über 2 Stunden neue Videos

    In letzter Zeit kommen immer wieder zwei Fragen im Kurs auf:

    • Wie kann ein Inventar aufgebaut werden?
    • Wie funktionieren ScriptableObjects?

    Ich freue mich, heute ein komplett neues Kapitel mit über 2 Stunden Spielzeit zu diesen Themen in meinem C#-Kurs anbieten zu können. Da Du bereits in den Kurs eingeschrieben bist, hast Du automatisch kostenlosen Zugang zu diesem Update.

    Braucht man Scriptable Objects für ein Inventar?

    Eines vorweg: ScriptableObjects sind ein eher fortgeschrittenes Thema. Man kann ein Inventar damit aufbauen, muss es aber nicht. Es kommt auf den jeweiligen Anwendungsfall an, ob sich der zusätzliche Aufwand und der Abstraktionsgrad, den diese Technik mit sich bringt, überhaupt lohnen. Ich habe mich bemüht, das Thema nachvollziehbar aufzubereiten und hoffe es ist mir gelungen.

    Ein Inventar kannst Du grundsätzlich auch mit den gleichen Mechanismen aufbauen, die wir am Beispiel Munition und Gesundheitsanzeige schon angesehen haben. Um bereits bekannte Techniken nicht nochmal zu wiederholen, sondern neues Zusatzwissen in den Kurs zu integrieren, habe ich mich entschlossen, das Inventar als Anwendungsbeispiel für eine ausführliche Erklärung des ScriptableObject-Systems zu nutzen, zumal dieses Thema ja konkret angefragt wurde.

    Inhalt dieses Updates

    • Was sind ScriptableObjects (und was nicht)?
    • Hello Scriptable Objects – allgemeines, unabhängiges Code-Beispiel.
    • Ziel und Arbeitsplan – Schema und Übersicht über den Aufbau des Inventars im Kurs-Projekt
    • Szenenobjekte anlegen
    • Datenstrukturen für das Inventar
    • Schatzkiste mit Schlüssel und Schatz
    • Input-Axis-Signal im Sinne eines Buttons auswerten
    • Szenenobjekte für die UI-Darstellung
    • Inventarzustand grafisch darstellen
    • Einfaches automatisches Layout
    • Ansätze zur Serialisierung – Besonderheiten bei ScriptableObjects
    • Umsetzung Laden und Speichern
    • Referenz-Code zum Download
    • Tipps und Tricks

    Wie so oft ist es leider nie möglich, alle Sonderfälle, Probleme und Eventualitäten zu behandeln. Bei konkreten Fragen und Unklarheiten kannst Du aber jederzeit einen entsprechenden Beitrag im Fragen und Antworten-Bereich stellen.

    Zudem habe ich in den letzten Wochen einige kleine Updates vorgenommen. Eine Liste der Änderungen findest Du jetzt in der letzten Lektion „Update-Protokoll„.

     

    Starte Jetzt!

    • ​Die neuen Inhalte sind sofort kostenlos zugänglich, wenn Du den Kurs bereits gebucht hast!
    • check​Als Neukunde erhältst Du das Update + alle bisherigen Inhalte, wenn Du Dich jetzt einschreibst.

    [bildnachweis]Figuren im Beitragsbild: Ragewortt / opengameart.org (CC-0)[/bildnachweis]

  • Icon für Firebase Push-Notification in Unity (Android) einstellen

    Icon für Firebase Push-Notification in Unity (Android) einstellen

    Wer ein Smartphone hat, kennt auch Push-Notifications, kleine Nachrichten, die in der Titelzeile erscheinen und auf vermeintlich interessante Inhalte wie z.B. neue Nachrichten hinweisen. Bei der Spiele-Entwicklung kommen diese Direktnachrichten, die sogar erscheinen, wenn die App nicht geöffnet ist, meistens die Funktion, den Spieler durch Anreize und Gratis-Geschenke zurück ins Spiel zu holen. In diesem Beitrag geht es um die Schritte, mit denen sich das Symbol der Push-Notification in Unity-Projekt setzen lässt. Dieses erscheint zunächst nämlich einfach als weißes Rechteck.

    Voraussetzung und Setup in Unity

    Das erforderliche Projekt sollte bereits so aussehen:

    • Unity 2017.3.1
    • Ziel-Plattform Android
    • Build-System: Gradle (ohne Export Project Option)
    • Kompiliert fehlerfrei in eine .apk-Datei

    Zudem seien die Google Play-Dienste bereits integriert:

    Kurz gesagt: die App läuft bereits auf dem Android-Smartphone und Push-Notifications lassen sich über die Firebase-Konsole zustellen. Lediglich das Icon ist falsch, es ist ein weißes Rechteck in der Titelzeile und beim Runterziehen der Nachrichten erscheint ein grauer Kreis mit dem Anwendungssymbol.

    Icon für Push-Notification erzeugen und anlegen

    Aktuell sieht die Gestaltungsrichtlinie von Google vor, dass das Benachrichtigungssymbol nur monochrom, also weiß und transparent, sein darf. Zudem sind normalerweise mehrere Größen erforderlich, um verschiedene Auflösungen zu unterstützen. Tipp: Du kannst z.B. den Notification Icon Generator benutzen, um das Icon im Browser zu erzeugen und die erforderlichen Dateiformate zu generieren.

    Ich habe sehr viel Zeit investieren müssen, um herauszubekommen, wo diese Icons nun in Unity zu platzieren sind. An der falschen Stelle abgelegt, bricht Gradle die Kompilierung mit einem Resource not found-Fehler ab. Leider steht nirgends, wo die Datei denn platziert werden muss, damit sie gefunden wird. Richtig ist: Kopiere die Unterordner aus dem zip, das Du vom Notification Icon Generator erhältst, mitsamt Ordnerstruktur einfach in den Unterordner Assets/Plugins/Android.

    Liegen die Ressourcen unterhalb von Plugins/Android, kann der Gradle-Build sie finden.
    Liegen die Ressourcen unterhalb von Plugins/Android, kann der Gradle-Build sie finden.

    Unitys AndroidManifest um eigene Einträge erweitern

    Fast genauso mühsam ist, herauszufinden, wie man eigene Einträge der AndroidManifest.xml hinzufügt, so dass sie von der beim Build automatisch erzeugten Version nicht überschrieben werden. Die Antwort ist: im Ordner Assets/Plugins/Android sollte bereits eine AndroidManifest.xml liegen. Diese wird beim Build mit der automatischen Version zusammengeführt.

    Daher fügen wir folgende Zeile ein, um das Standard-Icon für die Push-Notifications unserer App auf unser neues Icon zu setzen:

    <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_fafi_icon_android" />

    Wichtig: Der Dateiname ist dynamisch formuliert.

    • Der Ordnername @drawable wird von Android später automatisch zur jeweils benötigten Auflösung geändert, z.B. drawable-hdpi
    • Der Dateiname selbst ist der der Grafikdatei, ohne Formaterweiterung. Im Beispiel hier heißt die Datei z.B. Assets/Plugins/Android/res/drawable-hdpi/ic_stat_fafi_icon_android.png usw.

    Die ganze Assets/Plugins/Android/AndroidManifest.xml sieht dann z.B. so aus:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              package="${applicationId}"
              android:versionCode="1"
              android:versionName="1.0">
      <application android:label="@string/app_name"
                   android:icon="@drawable/app_icon">
        <!-- The MessagingUnityPlayerActivity is a class that extends
             UnityPlayerActivity to work around a known issue when receiving
             notification data payloads in the background. -->
        <activity android:name="com.google.firebase.MessagingUnityPlayerActivity"
                  android:label="@string/app_name"
                  android:icon="@drawable/app_icon"
                  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
          <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
          <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
        <service android:name="com.google.firebase.messaging.MessageForwardingService"
                 android:exported="false"/>
      
      
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_stat_fafi_icon_android" />
    
      </application>
    
    </manifest>

    Fehler mit Android Studio finden

    Wenn die Pfade, Namen und XML-Anmerkungen alle richtig sind, sollte das Icon der Push-Notification richtig erscheinen.

    Erforderliche Schritte sind nur noch:

    • Eine neue APK-Datei erstellen und aufs Handy hochladen
    • Eine Push-Nachricht über Firebase-Console absenden
    Push Notification einer Unity-App mit eigenem Symbol.
    Push Notification einer Unity-App mit eigenem Symbol.

    Wenn es nicht funktioniert

    …kann man den Grund suchen, in dem man den Inhalt der apk-Datei untersucht. Da er komprimiert ist, erfordert dies ein Tool wie Android Studio.

    • Android Studio starten und irgend ein Projekt öffnen (bzw. ein neues Anlegen)
    • Die .apk-Datei aus dem Datei-Explorer in den Dokument-Bereich ziehen.
    • Prüfen:
      • Enthält die AndroidManifest.xml auch wirklich den Eintrag für com.google.firebase.messaging.default_notification_icon?
      • Sind die Bild-Dateien richtig im Paket enthalten?
    Mit Android Studio lässt sich der Inhalt der apk-Datei prüfen.
    Mit Android Studio lässt sich der Inhalt der apk-Datei prüfen.

    Zusammengefasst

    Um das Standard-Symbol für Firebase Push-Notifications in einem Unity-Projekt für Android zu setzen, müssen die Bilddateien unterhalb von Assets/Plugins/Android/res liegen. Ergänzungen des XML-Manifests lassen sich in der Datei Assets/Plugins/Android/AndroidManifest.xml hinterlegen, die der Gradle-Build mit der automatisch erzeugten Manifestdatei zusammenführt.

     

  • Public oder SerializeField für Inspector-Sichtbarkeit?

    Public oder SerializeField für Inspector-Sichtbarkeit?

    Verschiedene Möglichkeiten, um Felder im Inspektor anzuzeigen

    Die Felder einer MonoBehaviour-Klasse lassen sich im Inspector des Unity-Editors direkt bearbeiten sofern sie als public deklariert und von einem durch den Inspector unterstützten Typ sind.

    Public-Elemente sind Inspector befüllbar.
    Public-Elemente sind Inspector befüllbar.

    Der Hack mit [SerializeField]

    Felder, die mit private oder auch protected geschützt sind, erscheinen im Inspektor nicht. Unity bietet allerdings ein Attribut namens SerializeField an, das die Sichtbarkeit im Inspektor auch für private Elemente erzwingt.

    Ein Seiteneffekt der SerializeField-Annotation ist, dass auch geschützte Felder im Inspector erscheinen.
    Ein Seiteneffekt der SerializeField-Annotation ist, dass auch geschützte Felder im Inspector erscheinen.

    In der Unity-Dokumentation der SerializeField-Anmerkung heißt es gleich zu Beginn, „you will almost never need this“, also „dies wirst Du so gut wie nie brauchen“. Ein solcher Hinweis sollte schon die Vermutung nahelegen, dass die Verwendung des SerializeField-Attributs nicht der korrekte Weg ist, um Felder im Inspector sichtbar zu machen. Der Begriff selbst sagt außerdem schon aus, dass er für etwas anderes entworfen wurde: „Serialize Field“ heißt soviel wie „speichere das Feld“. Das bezeichnet technisch also etwas anderes als die Anzeige im Inspektor, denn sonst würde es nicht SerializeField, sondern ShowInInspector heißen.

    Die Bedeutung von Sichtbarkeitsmodifikatoren

    Sehen wir uns den semantischen, also bedeutungsbezogenen, Unterschied etwas näher an.

    Public räumt anderen Klassen Zugriffsrechte ein.
    Public räumt anderen Klassen Zugriffsrechte ein.

    Eine Klasse kann verschiedene Elemente beinhalten und die Klasse selbst hat immer Zugriff darauf. Kommt nun eine zweite Klasse dazu, so wird durch Sichtbarkeitsmodifikatoren geregelt, worauf diese Klasse zugreifen darf. Der Modifikator public macht das Element nach außen sichtbar, so dass die andere Klasse darauf zugreifen darf. Private dagegen schützt das Element, so dass die äußere Klasse keinen Zugriff hat.

    Was SerializeField wirklich macht

    Die andere Klasse kann z.B. auch der Serialisierer bzw. Deserialisierer sein, der einen Mechanismus implementiert, um die Werte, die Elementen zugewiesen wurden in eine Datei zu speichern bzw. aus dieser wiederum zu laden. Aufgrund der C#-Sichtbarkeitskonzepte werden hier nur public-Elemente einbezogen. Um eine Klasseninstanz, also ein Objekt, vollständig zu speichern, kann es aber nötig sein, auch private Elemente mitzuspeichern. Um dies schnell und einfach möglich zu machen, stellt Unity das Attribut SerializeField zur Verfügung, das den Serialisierer anweist, die so markierten Elemente ebenfalls mitzuspeichern – unabhängig von deren Sichtbarkeitsregel.

    SerializeField umgeht die Sichtbarkeitseigenschaften.
    SerializeField umgeht die Sichtbarkeitseigenschaften.

    Der entscheidende Unterschied

    Der Inspector im Unity-Editor ist letztlich nichts anderes als eine grafische Benutzeroberfläche, für diesen Serialisierungsvorgang, d.h. die gespeicherten Daten werden nicht mehr nur direkt über die Datei, sondern auch über ein Eingabeformular gelesen und geschrieben.

    Wenn man nun den Inspector als außenstehende Klasse ansieht, was technisch auch der Fall ist, dann umgeht SerializeField die Sichtbarkeitseinstellung und gibt externen Komponenten Zugriff auf die internen Elemente einer Klasse, auf die es konzeptuell eigentlich keinen Zugriff haben sollte. Von der Code-Architektur her macht es so gesehen nicht viel Sinn SerializeField zu nutzen, denn entweder dürfen aussenstehende Klassen auf die Felder zugreifen – dann können sie auch public sein – oder sie dürfen eben keinen Zugriff haben, dann sollte das auch konsequent im Code so umgesetzt und private oder protected verwendet werden.

    [kursbanner thema=“csharp“]

     

     

     

  • XML oder PlayerPrefs für Savegames?

    XML oder PlayerPrefs für Savegames?

    Neulich kam im Support-Forum meines C#-Unity-Kurses die Frage auf, warum wir im Kurs den Spielstand in XML-Dateien und nicht in Unitys PlayerPrefs speichern. Dem Teilnehmer erschien die Serialisierung nach XML sehr viel aufwändiger und außerdem wäre die Schutzstufe des textuellen XML-Formats sehr niedrig, da jeder, also auch Spieler, die Datei verändern könnten.

     

    Weshalb wir im Kurs PlayerPrefs nicht verwenden

    PlayerPrefs sind in ihrer Struktur sehr begrenzt und eigenen sich nur zur Speicherung einzelner Werte (z.B. Float, Int, String). Komplexere Strukturen (fängt z.B. schon bei den häufig benutzten Typen Vector3 und Quaternion an, von eigenen Klassen ganz zu schweigen) sind nicht möglich. Im Verlauf des C#-Videokurses wechseln wir später von statischen Werten zu dynamischen Listen, so dass eine beliebige Anzahl von Objekten und Werten flexibel in das Savegame eingebunden werden kann. Das ist mit PlayerPrefs ebenso wenig möglich wie z.B. die Verwaltung mehrerer paralleler Spielstände. (Technisch ganz präzise: theoretisch zwar möglich, aber man müsste ein sehr aufwändiges Indizierungssystem selbst programmieren, das dann Listenfunktionen nachahmt.)

    PlayerPrefs eigenen sich meiner Meinung nach deshalb eher im Sinne einer ‚Cookie‘-Logik, also für das schnelle und einfache Sichern und Laden von einzelnen Werten, wie z.B. Programmeinstellungen.

    PlayerPrefs sind zudem schwer zu überprüfen und zu verwalten. Um eine Liste der gespeicherten Werte zu sehen, müsste man Tools schreiben oder in der Windows-Registry wühlen. Auf MacOS oder anderen Geräten wird es noch schwieriger, zumal sich auch die Speicherorte technisch noch unterscheiden. Insbesondere für einen eLearning-Kurs, bei dem die Nachvollziehbarkeit im Vordergrund stehen sollte, ist das denkbar ungüstig.

    Weshalb wir hier XML verwenden

    XML kann beliebige verschachtelte Strukturen ausdrücken und bleibt dabei lesbar und nachvollziehbar. Da ich davon ausgehe, dass viele Teilnehmer des Kurses verstehen wollen, wie die Technik funktioniert, eignet es sich daher hervorragend, um den Prozess zu erklären, weil transparent ist, welche Daten wie/wann/wohin fließen.

    Mit solchen dateibasierten Serialisierungsformaten ist es sehr leicht möglich, Spielstände zu öffnen, anzusehen, zu speichern, weitere parallel dazu anzulegen und komplexe Strukturen in einem Zug zu speichern und zu löschen. Dass .net hierfür bereits Serialisierungsmechnismen zur Verfügung stellt, die die Umwandlung vom Arbeitsspeicher in XML und zurück übernehmen, macht die Sache noch viel einfacher.

    Zu den Nachteilen von XML gehört ein gewisser Overhead an strukturgebenden Daten.

    [kursbanner thema=“csharp“]

    Das Problem der Offenheit

    Die Einsehbarkeit von XML kann natürlich unerwünscht sein, da nicht nur Entwickler, sondern auch jeder mit ein wenig technischer Sachkenntnis Veränderungen vornehmen kann. Eine Alternative wäre dabei die binäre Serialisierung, die im Prinzip ähnlich arbeitet, aber kein XML, sondern eine Binärdatei generiert. Diese ist nicht mehr so intuitiv zu verstehen.

    Die „Sicherung“ von Dingen wie z.B. Savegames ist ein seit jeher kontrovers diskutiertes Thema. Meine persönliche Meinung ist (mittlerweile), dass es sich in den seltensten Fällen lohnt, viel Aufwand in Schutzmaßnahmen zu stecken. Insbesondere als kleines Team oder Einzelentwickler sollte man seine Schaffenskraft statt dessen lieber auf die Verbesserung der eigentlichen Spielinhalte konzentrieren, denn:

    • PlayerPrefs sind genauso (wenn nicht sogar noch einfacher) zu manipulieren wie XML-Dateien, sie liegen nur an anderer Stelle.
    • Binärformate können ebenso manipuliert werden, es erfordert nur mehr Sachkenntnis. Nicht ohne Grund gibt es seit es Spiele gibt auch Trainer und Cheat-Tools, die genau das machen. Einige dieser Tools greifen sogar auf den Arbeitsspeicher zu, so dass es egal ist, wie/wo das Savegame gespeichert wird.
    • Anti-Cheats sind meiner Meinung sowieso nur bei Multiplayer oder irgend einer Form von Wettbewerb zwischen Spielern (z.B. Highscores) relevant und dann eigentlich nur durch Integration von Server-Komponenten absicherbar. Wenn ein Single-Player auf seinem Gerät durch Verändern des Savegames schummeln will – soll er doch. Warum ist das ein Problem – er betrügt nur sich selbst. 🙂
    • Man kann Verschlüsselungen einsetzen, um die Lesbarkeit der Datei zu erschweren, aber auch das ist nicht vollkommen sicher, insbesondere da C#-Programme leicht zurück zu kompilieren und die Logik somit zu analysieren und replizieren ist. (Davon abgesehen kann es sein, dass man beim Einsatz von Verschlüsselungstechnik gegen die Exportregelungen der USA verstößt und damit das Produkt für amerikanische Plattformen wie Steam oder Google Play Store disqualifiziert.)
    • … und sicher noch vieles mehr.

    Zusammengefasst

    Wir verwenden im Kurs XML, gerade weil es durch seine Lesbarkeit für Menschen sehr einfach manuell zu überprüfen ist und dabei eine große Flexibilität bietet. Zusätzlichen Aufwand durch Umsetzung der Objektserialisierung hat man nur am Anfang, später dreht es sich um und die Speicherung über PlayerPrefs wäre unter Umständen sogar sehr viel aufwändiger.

  • Deutsche Übersetzung für Blender aktivieren

    Deutsche Übersetzung für Blender aktivieren

    Für Blender lassen sich deutsche Bildschirmtexte aktivieren und das sogar von Haus aus und völlig ohne Plugin. Für den Einstieg kann es hilfreich sein, zunächst mit Deutsch zu arbeiten. Langfristig würde ich allerdings empfehlen sich möglichst früh mit Englisch zu befassen, weil sich fast alle Anleitungen, Tutorials und Hilfen auf die englische Version beziehen. Wenn Du Deutsch gewöhnt bist, musst Du quasi jeden Begriff zweimal lernen. Zudem kann es sein, dass nicht alle Programmteile übersetzt sind, insbesondere die, die gerade neu hinzugekommen sind.

    So aktivierst Du deutsche Texte für Blender

    • Öffne die Benutzereinstellungen über das Menü File > User Preferences
    • Gehe in den Tab System
    • Markiere das Auswahlfeld International Fonts rechts unten.
    • Wähle Deutsch (Deutsch) aus der Liste der Sprachen (Language) aus.
    • Klicke Interface, Tooltips und New Data an.
    Einstellung in den User-Settings.
    Einstellung in den User-Settings.

    [kursbanner thema=“blender“]