Unity3D Programming

11,436 views
11,131 views

Published on

My Unity3D programming session at GamesIS,Contech 2010 conference,Tel Aviv,09/11/2010

0 Comments
20 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,436
On SlideShare
0
From Embeds
0
Number of Embeds
94
Actions
Shares
0
Downloads
395
Comments
0
Likes
20
Embeds 0
No embeds

No notes for slide
  • Attention Deficit/Hyperactivity Disorder
  • Attention Deficit/Hyperactivity Disorder
  • Attention Deficit/Hyperactivity Disorder
  • Attention Deficit/Hyperactivity Disorder
  • Unity3D Programming

    1. 1.  Ivanov Michael  Lead Programmer R&D,Neurotech Solutions LTD  Writer for Packt Publishing.,”Away3D Cookbook”  Expert in Flex/AIR, Open Source Flash 3d engines.  Spare time:Unity,UnrealEngine,OpenGL,Java3D  Visit my tech blog:http://blog.alladvanced.net
    2. 2.  How many of you have never heard of Unity?  How many of you are designers ?  How many of you come from Flash/ActionScript background?  How many of you programmed in Unity? What language?  How many of you accomplished commercial projects with Unity ?
    3. 3.  Unity engine API model  Unity programming paradigm  Scripting Languages  Scripting practices  Unity GameObject structure  Examples walkthrough
    4. 4.  How to program(You should learn by yourselves)  Level design(designers –sorry)  Advanced programming  Shaders  Much more cool and important stuff because of time limitation.  P.S For the rest of disclaimer please refer to:GNU General Public License Stay tuned for Unity3D workshop announcement
    5. 5. Audio Engine Particle System Engine Terrain Engine Physics Engine GUI System Animation Engine Network API Shaders programmingAPI Unity Engine Core C# JavaScript Boo(Python) ShaderLab,Cg,GLSL Sealed
    6. 6. WindZone LightCamera Rigid Body Collider Mesh Filter Particle Emitter Audio Source Custom GameObject Camera FPSControl ler AudioListe ner GameObject Shader Prefab Material Script File AnimationAssets Customized Game Object Components (Resource Library)
    7. 7. UnityScript(JavaScript) MONO(C#) Pros •20X faster than web JS •Flexible coding(no need in data types declaration, no class body explicit typing required) •Beginners friendly •Well documented in Unity docs •C family(fast adaptation for experienced devs) •Strong typing •Robust .NET Framework(Event Model,threads,structs and more C# specific) •External IDE software availability •Piles of docs in theWeb •Portability to other platforms •DLL libs support Cons •No explicit variable types declaration required •iPhone builds are bigger than C#(additional libs added) •language specific restrictions: No multi- dimensional arrays definition, no pass values by reference into functions(needs workaround),no Char data type , no multiple interface implementation only one class or interface are allowed to be extended •Poor Even Model(custom approach is slow) •Partial implementation of .NET(no virtual classes allowed, no namespaces, limited multi-threading,Timer.. •Less documented in Unity docs
    8. 8. class MyClass extends MonoBehaviour { var myVar = 1; function Start() { Debug.Log("hello world!"); } } class MyClass : MonoBehaviour { public int myVar = 1; void Start() { Debug.Log("hello world!"); } } Java Script C#
    9. 9. Surprisingly you can write with both of them in one project!(one way communication only) Script Script Script Script Standard Assets ((Compiled first My Scripts Folder(Outside) (Compiled last) C#JavaScript Script Script Script Script
    10. 10. Player GameObject Enemy GameObject WeaponPickUps GameObject GUI Module GameObject Script Script Script Script Script Script Script Script (Main())GameObject (Entry point)Script ScoreManagerSoundManager LevelManager BackEndManager Script ScriptScriptScript
    11. 11. using UnityEngine; using System.Collections; public class MyNewBehaviour : MonoBehaviour { public static AudioClip playingClip;//////---accessible from outside to all void Start () { } void Update () {///////// see also FixedUpdate } void OnMouseDown(){ } void OnCollisionEnter(){ } public void SpawnEnemy(){////////-------------------your custom method } }
    12. 12. “TF2 Dancing Spy” demo
    13. 13. FPSController SceneManager CharacterManager AudioManager GUIManager Generic Scripts VideoManager LightProjector AnimatedCamera ScriptsInit DirectionalLight TileManager SpectrumReader ProjectorTransformer WallGenerator Tile(dynamic add) WallSyntezator iTween Utils Spy Monitor1 Monitor2 Monitor3
    14. 14. FPSControllerSceneManager CharacterManager AudioManager GUIManager Generic Scripts VideoManager LightProjector AnimatedCamera DirectionalLight TileManager SpectrumReader ProjectorTransformer WallGenerator Tile(dynamic add) WallSyntezator iTween Spy Animation Button Resources MP3MP3 Generic Scripts iTween Monitor1 Monitor2 video
    15. 15. Hovermobile Demo
    16. 16. Fire Ball Demo
    17. 17.  Time.time  Time.deltaTime  C# System.Timers.Timer Update() and FixedUpdate() FixedUpdate synchronized with Physics Engine steps while Update() runs on each frame Always use FixedUpdate() for physics! F F F F F 0.1 seconds0.0 seconds U U U U U U U U U U
    18. 18.  Time.time  Time.deltaTime  C# System.Timers.Timer Update() and FixedUpdate() FixedUpdate synchronized with Physics Engine steps while Update() runs on each frame Always use FixedUpdate() for physics! F F F F F 0.1 seconds0.0 seconds U U U U U U U U U U
    19. 19. TileManager tlm = tile.GetComponent<TileManager> (); void locateAndAssignCams(){ camFPS=GameObject.Find("MainCamera"); camAnim=GameObject.Find("AnimatedCam"); } Public variables reference.(Set via component interface) •GetComponent: •Find() ,FindObjectOfType(),FindObjectsOfType() Light light = FindObjectOfType(typeof(Light)); if(AudioManager.spectrumData!=null&&AudioManager.spectrumData.Length>0){ currentSpectrum=AudioManager.spectrumData; } Direct access via static members
    20. 20. AudioClip aclip=(AudioClip)Resources.Load("Sounds/gagaSong"); _audioSource.clip=aclip; playingClip=aclip; _audioSource.Play(); Create object in runtime: Instantiate Prefab GameObject tile = (GameObject)Instantiate (tilePF,Vector3.zero, Quaternion.identity); void Start () { _light=new GameObject("Light1"); _light.AddComponent<Light>(); _light.light.type=LightType.Point; _light.light.range=400; _light.light.color=Color.red; _light.transform.Translate(newVector3(1000,200,1000)); } Dynamic resource assets loading
    21. 21. What are these matrices and vectors anyways? Core Classes:  Mathf .(Also C# System.Math )  Matrix4x4  Vector2/3/4  Quaternion –all Rotations are Quaternion based
    22. 22. “In Physics Land talk Physics”
    23. 23. Core Classes: •Physics- Global physics properties and helper methods. •RigidBody-contains all essential physics methods and properties for a body
    24. 24. AddTorque() RigidBody SpaceCraft GameObject gravity AddForce() Colliders AddForceAtPosition()
    25. 25.  Self attachment _audioSource=gameObject.AddComponent<AudioSource>();  Indirect attachment GameObject tile = (GameObject)Instantiate (tilePF,Vector3.zero, Quaternion.identity); AudioSource audioSource=tile.AddComponent<AudioSource>(); //adding audio source component to the tile and accessing it at the same time//
    26. 26.  Yield Ensures that the function will continue from the line after the yield statement next time it is called Can’t be used inside “Time” methods like Update(),FixedUpdate()  Coroutine Suspends its execution until givenYield instruction finishes. Requires a method to be IEnumerator
    27. 27. IEnumerator Start () { print ("first"); yield return new WaitForSeconds(2f); print ("2 seconds later"); } Yield
    28. 28. using UnityEngine; using System.Collections; public class StupidLoop : MonoBehaviour{ private bool buttonPressed= false; void Update () { if(!buttonPressed) { if(Input.GetButtonDown("Jump")) { StartGame(); } } print("looping..."); } void StartGame() { buttonPressed= true; print("Game Started"); } } NoYield & Coroutines scenario(Ugly one)
    29. 29. void Start(){ StartCoroutine(WaitForKeyPress("Jump")); } public IEnumerator WaitForKeyPress(string _button) { while(!buttonPresed) { if(Input.GetButtonDown (_button)) { StartGame(); yield break; } print("Awaiting key input."); yield return 0; } } private void StartGame() { buttonPressed= true; print("Starting the game officially!"); } } Simple example
    30. 30. void Start () { glEffect=GameObject.Find("Main Camera").GetComponent<GlowEffect>(); StartCoroutine("explodeCounter"); } IEnumerator explodeCounter(){ onTimerElaps(); if(amount<15){ yield return new WaitForSeconds(0.01F); }else{ Mesh myMesh = GetComponent<MeshFilter>().mesh; GameObject.Destroy(myMesh); yield break; } StartCoroutine("explodeCounter"); } void onTimerElaps(){ amount+=Mathf.Sin(Time.time)/5; glEffect.glowIntensity=amount/2; ExplodeMesh(amount); } Practical example
    31. 31. IEnumerator Start () { yield return StartCoroutine(MyWaitFunction (4.0f)); print ("4 seconds passed"); yield return StartCoroutine(MyWaitFunction (5.0f)); print ("9 seconds passed"); } IEnumerator MyWaitFunction (float delay) { float timer =Time.time + delay; while (Time.time < timer) { Debug.Log(Time.time); yield return true; } } Sequential Coroutines calls
    32. 32. Unity built-in event system  SendMessage()-Calls the method on every MonoBehaviour in this game object.  BroadcastMessage()- Calls the method on every MonoBehaviour in this game object or any of its children. Downside: Need to target methods by their name (Errors prone) Work only within the object's transform hierarchy  Controller Class registers all the classes to be notified of changes via reference Downside : Flexibility & Scalability Nightmare for big projects
    33. 33.  Dispatcher class public class EventSender : MonoBehaviour { public delegate void GameObjectPressHandler(GameObject e); public event GameObjectPressHandler OnGameObjectPress; private void DispatchPressEvent () { if (OnGameObjectPress != null){ OnGameObjectPress (this.gameObject);//event has been fired! } } } public GameObject gm; EventSender myEventSender=gm.getComponent<EventSender>(); myEventSender.OnGameObjectPress+=new GameObjectPressHandler(onGMPress); Private void onGMPress(GameObjject gm){ print(gm+”was has been!”); } Listener Class
    34. 34. Thank you and good luck!

    ×