Unity Programming – Classes Overloading – Intermediate – CSharp

How does classes overloading work in Unity?

Create an ‘Empty Object’ and attack SomeOtherClass.cs


// SomeOtherClass.cs

using UnityEngine;
using System.Collections;

public class SomeOtherClass : MonoBehaviour
{
    void Start()
    {
        SomeClass myClass = new SomeClass();

        //The specific Add method called will depend on
        //the arguments passed in.
        int mysum = myClass.Add(1, 2);
        string mytext = myClass.Add("Hello ", "World");

        Debug.Log(mysum); // 3
        Debug.Log(mytext); // Hello World
    }

    public class SomeClass
    {
        //The first Add method has a signature of
        //"Add(int, int)". This signature must be unique.
        public int Add(int num1, int num2)
        {
            return num1 + num2;
        }

        //The second Add method has a sugnature of
        //"Add(string, string)". Again, this must be unique.
        public string Add(string str1, string str2)
        {
            return str1 + str2;
        }
    }
}

We have overloading when we call a class that has 2 or more methods with the same name.
In the script: – public int Add(int num1, int num2) – and – public string Add(string str1, string str2)
have the same name but the parameters are different and Unity can recognize them as unique.

Reference:
unity3d.com/learn/tutorials/topics/scripting/method-overloading?playlist=17117

By |CSharp, Unity3D, Video Games Development|Commenti disabilitati su Unity Programming – Classes Overloading – Intermediate – CSharp

Unity Programming – Nested Classes – CSharp – Intermediate

How to access properties of a nested class from another script.
Accesso ad una proprietà all’interno di una classe annidata in uno script esterno.

Create an ‘Empty Object’ and attach the scripts:

– SomeClass.cs


using UnityEngine;
using System.Collections;

public class SomeClass : MonoBehaviour // deve essere MonoBehaviour anche questa o non funziona
{
    // proprietà della classe principale
    public int bullets = 10;

    // classe annidata
    
    [System.Serializable] // DEVO dichiarala Serializable o non si può accede da uno script esterno
    public class Something
    {
        // proprietà della classe annidata
        public int fuel = 15;
    }
    public Something Some; // la inserisco in una variabile
}

– SomeOtherClass.cs


using UnityEngine;
using System.Collections;

public class SomeOtherClass : MonoBehaviour
{
    void Start()
    {
        // il nome SomeClass è quello dello script SomeClass.cs
        SomeClass SomeClassScript = transform.GetComponent<SomeClass>();

        // variabile che contiene la classe principale . proprietà
        Debug.Log(SomeClassScript.bullets); // 10

                   // nomeScript.nomeVariabileClasse.proprietà
            Debug.Log(SomeClassScript.Some.fuel); // 15
    }
}

Come funziona?

1. SomeOtherClass.cs

– memorizza in una variabile lo script ottenuto con GetComponent
– richiama la proprietà della classe principale SomeClassScript.bullets
– richiama la proprietà della classe annidata SomeClassScript.Some.fuel

2. SomeClass.cs

– dichiaro l’accessibilità della classe dall’esterno serializzandola [System.Serializable]

– inserisco la classe in una variabile public Something Some
Posso notare che poi la chiamata sarà su – Some – SomeClassScript.Some.fuel

By |CSharp, Unity3D, Video Games Development|Commenti disabilitati su Unity Programming – Nested Classes – CSharp – Intermediate

Unity Programming – Classes – Beginners – CSharp

How does classes work in Unity?

Create an ‘Empty Object’ and attack Inventory.cs


// Inventory.cs

using UnityEngine;
using System.Collections;

public class Inventory : MonoBehaviour // il nome del file e della classe sono uguali
{
    // Creating an Instance (an Object) of the Stuff class
    public Stuff myStuff = new Stuff(10, 20, 30, 40); // il nome dell'oggetto è uguale al nome della classe è uguale al costruttore
    // We can create infinite Instances
    public Stuff myOtherStuff = new Stuff(50, 60, 70, 80);
    public Stuff myOtherStuffTwo = new Stuff(); // senza parametri assegna i valori di default
    public Stuff myOtherStuffThree = new Stuff(10.2F); // in base alla natura dei parametri riconosce il metodo, qui cerca lo Stuff() che accetta FLOAT


    void Start()
    {
        Debug.Log(myStuff.bullets); // 10
        Debug.Log(myOtherStuff.grenades); // 60
        myOtherStuff.grenades = 100; // cambio il valore dell'oggetto
        Debug.Log(myOtherStuff.grenades); // 100
        Debug.Log(myOtherStuffTwo.grenades); // 2
        Debug.Log(myOtherStuffThree.magicEnergy); // 10.2

    }

    public class Stuff // nome della classe
    {
        // proprietà
        public int bullets;
        public int grenades;
        public int rockets;
        public int fuel;

        public float magicEnergy;

        // metodo con l'arrivo dei parametri
        public Stuff(int bul, int gre, int roc, int fue) // nome del costruttore uguale a quello della classe
        {
            bullets = bul;
            grenades = gre;
            rockets = roc;
            fuel = fue;
        }

        // metodo senza l'arrivo dei parametri
        public Stuff() // nome del costruttore uguale a quello della classe
        {
            bullets = 1;
            grenades = 2;
            rockets = 3;
            fuel = 4;
        }

        public Stuff(float magicen) {
            magicEnergy = magicen;
        }
    }
}// END Inventory : MonoBehaviour

Rules:

– Inventory.cs and public class Inventory have the same name

– public Stuff myStuff = new Stuff(10, 20, 30, 40); same name in the instance call Stuff

– public Stuff() same name for the method Stuff

– public Stuff myOtherStuffThree = new Stuff(10.2F); Unity recognize automatically the method he needs reading the type of parameters passed, this technique is called ‘Overloading’.

By |CSharp, Unity3D, Video Games Development|Commenti disabilitati su Unity Programming – Classes – Beginners – CSharp

Unity – Load a JPG local resource or www and apply to Texture or to UI Image

Hi Nice people!
Today I’ll talk about load a JPG image from an external source and use it in your games or apps, so let’s start!
First we have to stop watching image with eyes… I mean… now we’ll watch our full of color world as Neo of Matrix, we’ll see a sequence of bytes dropping everywhere :)

If you convert an image to byte array you will get something like that:

0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x08,0x00,0x00,0x00,0x00,0x8F,0x02,0x2E,
0x02,0x00,0x00,0x01,0x57,0x49,0x44,0x41,0x54,0x78,0x01,0xA5,0x57,0xD1,0xAD,0xC4,
0x30,0x08,0x83,0x81,0x32,0x4A,0x66,0xC9,0x36,0x99,0x85,0x45,0xBC,0x4E,0x74,0xBD,
0x8F,0x9E,0x5B,0xD4,0xE8,0xF1,0x6A,0x7F,0xDD,0x29,0xB2,0x55,0x0C,0x24,0x60,0xEB,
0x0D,0x30,0xE7,0xF9,0xF3,0x85,0x40,0x74,0x3F,0xF0,0x52,0x00,0xC3,0x0F,0xBC,0x14,

… etc …

This is the way used by Unity to see the images O.O

Let’s go on with practice, theory is boring :p

Load local JPG and apply to GameObject-Material-MainTexture

1. Create a Scene with a Cube and attach the script below:

2. c# script


using UnityEngine;
using System.Collections;
using System.IO; // namespace to use File.ReadAllBytes

public class LoadLocalTexture : MonoBehaviour {

	string filePath;        // it is as "D:/Unity/Photo-Voodoo/FotoTest/img1.jpg"

	public byte[] fileData; // load data inside a byte array 0x89,0x50,0x4E,0x47,0x0D...

	public void Start() {

		 filePath = "D:/MyFolder/img1.jpg";                   // the path of the image
		 fileData = File.ReadAllBytes(filePath);              // 1.read the bytes array
		 Texture2D tex = new Texture2D(2, 2);                 // 2.create a texture named tex
		 tex.LoadImage(fileData);                             // 3.load inside tx the bytes and use the correct image size
		 GetComponent<Renderer>().material.mainTexture = tex; // 4.apply tex to material.mainTexture 
	}// END Start
	
	void Update () {
	
	}// END Update()
}// END Mono


Load local JPG and apply to UI Image

1. Create a Scene with a UI Image and attach the script below:

2. c# script


using UnityEngine;
using System.Collections;
using UnityEngine.UI; // namespace to use UI
using System.IO; // namespace to use File.ReadAllBytes

public class LoadLocalTextureToImageUI : MonoBehaviour {

	string filePath;        // it is as "D:/Unity/Photo-Voodoo/FotoTest/img1.jpg"
	public byte[] fileData; // load data inside a byte array 0x89,0x50,0x4E,0x47,0x0D...

	public Image imageToDisplay; // Assign in Inspector the UI Image

	// Use this for initialization
	void Start () {

		filePath = "D:/MyFolder/img1.jpg";                   // the path of the image
		fileData = File.ReadAllBytes(filePath);              // 1.read the bytes array
		Texture2D tex = new Texture2D(2, 2);                 // 2.create a texture named tex
		tex.LoadImage(fileData);                             // 3.load inside tx the bytes and use the correct image size 
		Rect rec = new Rect(0, 0, tex.width, tex.height);    // 4.create a rect using the textute dimensions
		Sprite spriteToUse = Sprite.Create(tex,rec,new Vector2(0.5f,0.5f),100); //5. convert the texture in sprite
		imageToDisplay.sprite = spriteToUse;                 //6.load the sprite used by UI Image
	}// END Start()
	
	// Update is called once per frame
	void Update () {
	
	}// END Update()
}// END Mono

3. Assign in Inspector the UI Image to imageToDisplay variable

Load www JPG and apply to UI Image

1. Create a Scene with a Cube and attach the script below:

2. c# script


using UnityEngine;
using System.Collections;
using UnityEngine.UI; // namespace to use UI

public class LoadwwwTextureToImageUI : MonoBehaviour {

	public Image imageToDisplay; // Assign in Inspector the UI Image
	public string addressWeb = "http://www.lucedigitale.com/img1.jpg";

	// Use this for initialization
	void Start () {

		StartCoroutine(isDownloading(addressWeb)); 

	}// END Start()
		

	IEnumerator isDownloading(string url){
		yield return new WaitForSeconds(1); // wait for one sec, without it you will have a compiiler error
		
		
		var www = new WWW(url); // 1.start a download of the given URL           
		yield return www;       // 2.wait until the download is done
                                        // 3.create a texture in DXT1 format
		Texture2D texture = new Texture2D(www.texture.width, www.texture.height, TextureFormat.DXT1, false);
		                        
		www.LoadImageIntoTexture(texture); //4.load data into a texture
		Rect rec = new Rect(0, 0, texture.width, texture.height); //5.create a rect using texture dimensions
		Sprite spriteToUse = Sprite.Create(texture,rec,new Vector2(0.5f,0.5f),100); // 6.convert the texture to sprite
		imageToDisplay.sprite = spriteToUse; //7.change the sprite of UI Image

		www.Dispose(); //8.drop the web connection NOTE: Unity drop automatically the connection at the end of the download, but we put it as a precaution

		www = null;

	}// END IEnumerator

	void Update () {
	
	}// END Update()

}// END Mono

3. Assign in Inspector the UI Image to imageToDisplay variable

I hope this article has been helpful, greetings :)

Reference: https://docs.unity3d.com/ScriptReference/Texture2D.LoadImage.html
Reference: http://answers.unity3d.com/questions/1122905/how-do-you-download-image-to-uiimage.html

By |CSharp, Unity3D, Video Games Development|Commenti disabilitati su Unity – Load a JPG local resource or www and apply to Texture or to UI Image

Google Cardboard and Gear VR Basic Scene Setup

I think it is the right moment to talk abour VR in games and in multimedia entertainment.

WHAT IS VIRTUAL REALITY?

The word ‘virtual reality’ has been used and abused for many years in the comics and in science fiction films.

In the 70s science fiction movies VR was imagined as a computer-simulated reality that replicates an environment, real or imagined, and simulates a user’s physical presence and environment to allow for user interaction.

In the ‘real life’ Atari founded a research lab for virtual reality in 1982, but the lab was closed after two years due to Atari Shock (North America video game crash of 1983).

In 1991, Sega announced the Sega VR headset for arcade games and the Mega Drive console. It used LCD screens in the visor, stereo headphones, and inertial sensors that allowed the system to track and react to the movements of the user’s head.

On 2014, Facebook purchased a company that makes virtual reality headsets, Oculus VR, for $2 billion. Sony announces Project Morpheus (its code name for PlayStation VR), a virtual reality headset for the PlayStation 4. Google announces Cardboard, a do-it-yourself stereoscopic viewer for smartphones.

On 2015, HTC partnered with Valve Corporation announced their virtual reality headset HTC Vive and controllers, along with their tracking technology called Lighthouse.

Now the technology to make VR is reality, and it is accessible to all, now it is up to software developers to create killer applications to exploit it properly.

HOW IT WORKS?

Stereoscopy is the keyword. Stereoscopy is a technique for creating or enhancing the illusion of depth in an image by means of stereopsis for binocular vision.
Most 3D displays and gears use this stereoscopic method to convey images. It was first invented by Sir Charles Wheatstone in 1838, then… not science fiction but old story.

SOFTWARE SETUP

1. Download Java SE Development Kit 8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Install it.

2. Download Android Studio https://developers.google.com/vr/unity/get-started-android
Install using the “SDK Tools Only” option.
On some Windows systems, the launcher script does not find where the JDK is installed. If you encounter this problem, you need to set an environment variable indicating the correct location.
Select Start menu > Computer > System Properties > Advanced System Properties. Then open Advanced tab > Environment Variables and add a new system variable JAVA_HOME that points to your JDK folder, for example C:\Program Files\Java\jdk1.8.0_77.

3. Download the Google VR SDK for Unity here: https://developers.google.com/vr/unity/

4. Open Unity (working with the Google VR SDK for Unity requires Unity 5.2.1 or later)
Assets> Import Package> ‘GoogleVRForUnity.unitypackage’, uncheck Plugins/iOS and ‘Import’.
Under Project window we will see Assets/GogleVR and Assets/Plugin

NOTICE: if the Unity console write about a script error, ignore it and Switch Platform to Android

5. Unity> Build Settings> Android and Texture Compression ETC2 (GLES 3.0)

UNITY CAMERA BASIC SETUP

1. Create a New Scene

2. Create a Plane and a Cube

3. Project> Assets> GoogleVR> Prefabs> GvrMain DRAG AND DROP in Hierarchy

4. Hierarchy> GvrMain > Head> Main Camera> Inspector> Add Component> Physics Raycaster (NOT THE Physics 2D Raycaster!!!)
The Raycaster raycasts against 3D objects in the scene. This allows messages to be sent to 3D physics objects that implement event interfaces.

5. Delete the old ‘Main Camera’

6. Project> Assets> GoogleVR> Prefabs> UI> GvrReticle, DRAG AND DROP in Hiearchy over Main Camera, here we are:
GvrMain
– Head
– – Main Camera
– – – Main Camera Left
– – – Main Camera Right
– – – CardboardRetiche

7. Press Play and rotate the camera using ALT + move the mouse without clicking.

UNITY INPUT SETUP

1. RMB on a empty area in Hierarchy> UI> add an ‘Event System’

2. Event System> Inspector> Add Component> GazeInputModule.cs, gear icon> ‘Move Up’ the component, the correct order is:

Transform
EventSystem (Script)
GazeInputModule (Script)
Standalone InputModule (Script)

3. Cube> Inspector> assign a Green material

4. Cube> Inspector> Add Component> EventTrigger (Script)> ‘Add New Event Type’> Pointer Enter> +> in the Empty Slot DRAG Cube, No Function> MeshRenderer> Material> DRAG a Red material

5. Cube> Inspector> Add Component> EventTrigger (Script)> ‘Add New Event Type’> Pointer Exit> +> in the Empty Slot DRAG Cube, No Function> MeshRenderer> Material> DRAG a Green material

6. Play

– pointer Enter material changes to Red
– pointer Exit material changes to Green

The interactions detection system flow is:

a) main Camera/Physics Raycaster + CardboardReticle send rays
b) rays casts Cube/Box Collider
c) Cube/Event Trigger sends data to Hierarchy/EventSystem
d) Hierarchy/EventSystem + Gaze Input Module manages data

If it does not work check the ‘Physics Raycaster (Script)’ attached to the Main Camera or the Box Collider of the Cube.

CARDBOARD / GEARVR BUILDING SETUP

1.
GearVR:
– Player Settings> Virtual Reality support enabled -> this split the camera and track position/rotation for GearVR only
– GvrMain> GvrViewer (Script)> VR Mode disabled
– GvrMain> Head> GvrHead (Script)> Track position disabled
– GvrMain> Head> GvrHead (Script)> Track rotation disabled

Card Board:
– Player Settings> Virtual Reality support disabled
– GvrMain> GvrViewer (Script)> VR Mode enabled -> this split the camera for Card Board only
– GvrMain> Head> GvrHead (Script)> Track position enabled -> this track position for Card Board only
– GvrMain> Head> GvrHead (Script)> Track rotation enabled -> this track rotation for Card Board only

2.
Build Settings> Player settings
– Company Name: MyCompany
– Product Name: CardBoardTest
– Default orientation: Landscape Left
– Multithreaded Rendering: on
– Bundle Identifier: com.mycompany.cardboardtest
– Minimum API Level: Android 4.1 (API Level 16)
– Device Filter: ARMv7
– Android TV Compatibility: off

3. Add the corrent scene to build

4. Build and Play!

5. Assets> Plugins> Android> create a folder ‘assets’, copy here your oculus signature file, generate it using https://developer.oculus.com/osig/

References:
Wikipedia – https://en.wikipedia.org/wiki/Stereoscopy
Dev Android – https://developer.android.com/studio/index.html
NurFACEGAMES – https://www.youtube.com/watch?v=eLCj6_gtLc4

By |CSharp, Unity3D, Video Games Development|Commenti disabilitati su Google Cardboard and Gear VR Basic Scene Setup