Friday, September 15, 2017

Avoid FindObjectsOfType with this Pattern

public class SomeComponent : MonoBehaviour
{
    public static List<SomeComponent> Instances = new List<SomeComponent>();
    private int instanceIndex = -1;

    void OnDisable() {
        var lastIndex = Instances.Count - 1;
        Instances[instanceIndex] = Instances[lastIndex];
        Instances[instanceIndex].instanceIndex = instanceIndex;
        Instances.RemoveAt(lastIndex);
    }

    void OnEnable()
    {
        Instances.Add(this);
        instanceIndex = Instances.Count - 1;
    }
}

Tuesday, August 22, 2017

Vector3.sqrMagnitude vs Vector3.magntiude


sqrMagnitude is 20% faster than magnitude.

magnitude: 0.862013
srqMagnitude: 0.689175


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Diagnostics;

public class MagVsSqrMag : MonoBehaviour
{

    void Start()
    {
        var C = 10000000f;
        var sw = new Stopwatch();
        var vec = new Vector3(Random.value, Random.value, Random.value);
        var r = 0f;
        for (var i = 0; i < C; i++)
        {
            sw.Start();
            r += vec.magnitude;
            sw.Stop();
        }
        UnityEngine.Debug.Log("magnitude:" + (sw.ElapsedTicks / C));
        sw.Reset();
        vec = new Vector3(Random.value, Random.value, Random.value);
        for (var i = 0; i < C; i++)
        {
            sw.Start();
            r += vec.sqrMagnitude;
            sw.Stop();
        }
        UnityEngine.Debug.Log("srqMagnitude:" + (sw.ElapsedTicks / C));

        UnityEngine.Debug.Log(r);
    }

}

Monday, February 13, 2017

Take a Unity Screenshot with Alpha

This script takes a screenshot and saves it to the user desktop. It has options to use an alpha background, and also upscale the image. Useful for taking pictures of a scene or model for composition by artists.


using UnityEngine;
using System.IO;
using System;

[RequireComponent (typeof(Camera))]
public class CaptureWithAlpha : MonoBehaviour
{
    public int UpScale = 4;
    public bool AlphaBackground = true;

    Texture2D Screenshot ()
    {
        var camera = GetComponent<Camera> ();
        int w = camera.pixelWidth * UpScale;
        int h = camera.pixelHeight * UpScale;
        var rt = new RenderTexture (w, h, 32);
        camera.targetTexture = rt;
        var screenShot = new Texture2D (w, h, TextureFormat.ARGB32, false);
        var clearFlags = camera.clearFlags;
        if (AlphaBackground) {
            camera.clearFlags = CameraClearFlags.SolidColor;
            camera.backgroundColor = new Color (0, 0, 0, 0);
        }
        camera.Render ();
        RenderTexture.active = rt;
        screenShot.ReadPixels (new Rect (0, 0, w, h), 0, 0);
        screenShot.Apply ();
        camera.targetTexture = null;
        RenderTexture.active = null;
        DestroyImmediate (rt);
        camera.clearFlags = clearFlags;
        return screenShot;
    }

    [ContextMenu ("Capture Screenshot")]
    public void SaveScreenshot ()
    {
        var path = Environment.GetFolderPath (Environment.SpecialFolder.Desktop);
        var filename = "SS-" + DateTime.Now.ToString ("yyyy.MM.dd.HH.mm.ss") + ".png";
        File.WriteAllBytes (Path.Combine (path, filename), Screenshot ().EncodeToPNG ());
    }
}

Friday, February 03, 2017

Building fast, quality network server programs with Go.

I've been investigating and learning Go. There is a lot of high quality tools out there, for example:

- xo generates types and functions to match your SQL schema, and

- goa lets you design a REST api using a DSL, then generate the code to implement that API!

Compile time for Go is super fast, and so is the built executable. I'm using vim for the IDE, and it has excellent support for Go, including autocompletion which is great when you're learning the language.

Wednesday, January 25, 2017

A HTTP server embedded inside Unity3D.

Just 514 lines of code. Uses sockets only, no other dependencies.

https://github.com/simonwittber/uniwebserver

Example Component:

[RequireComponent(typeof(EmbeddedWebServerComponent))]
public class FileUpload : MonoBehaviour, IWebResource
{
    public string path = "/upload";
    public TextAsset html;
    EmbeddedWebServerComponent server;

    void Start ()
    {
        server = GetComponent<EmbeddedWebServerComponent>();
        server.AddResource(path, this);
    }
 
    public void HandleRequest (Request request, Response response)
    {
        response.statusCode = 200;
        response.message = "OK.";
        response.Write(html.text);
    }
}    

Popular Posts