Website may be up and down over next few months. I'm currently doing a complete overhaul of everything. Going back to simple individual .htm pages, new overall site theme, sanitizing and cleaning up html of all pages and blog posts, attempting to implement a new tooling and publishing system etc etc.

If you are submitting packages to the asset store and are including version changes that contain html links, remember to specify target="_blank" in your link attributes. Failure to do so can result in the asset store window being replaced by the web page that your link was pointing to. In some occasions it can also cause unity to crash.

Unity101Tip52


I have been thinking that because texture atlases are so common Unity should have some build in support for generating them. Turns out it already does! Check out the Texture2D.PackTextures method.


Legacy of Kain: Soul Reaver Reduex

Published 2/3/2013 by createdbyx in News | Games
Tags:

Just finished playing Legacy of Kain: Soul Reaver last night and even after all these years it’s still an EPIC game. I purchased the Steam bundle that includes Legacy of Kain: Soul Reaver, Legacy of Kain: Soul Reaver 2 & Legacy of Kain: Defiance.

This game was a pain at times to get running and crashed about 20 times during my play through, Sound would glitch and sound FX would stop playing and I’d worry if I was missing any dialog. Had to use a hacked ATI driver and run the game in software mode just to play it. Can't imagine how hard it will be trying to run it in another 10+ years from now.

YouTube user user DonKain has posted a 32 part video walkthrough from beginning to end if you don’t want to buy the game but still want to see what it’s all about.

Before playing soul reaver I first tried to play Blood Omen: Legacy of Kain. What a nightmare that was. Took days of messing around trying to install windows 95/98 & XP in various virtual machines to no avail. Finally gave up and tried running a PSX iso image with a PSX emulator but after hours of frigging around trying to get it to render properly under the emulator I gave up. After a week of trying to get the game running I decided to see if YouTube had a video of it and found a 27 part play through by user Tiff0202.

Blood Omen: Legacy of Kain is a 2D game and it was remarkably difficult to get running under modern technology, and times when I did get it running it was not really playable due to rendering glitches even under an emulator. This does not bode well for all those amazing games of late 80’s & 90’s. Only 15 years later and they are getting progressively harder and harder to get up and running without having a dedicated computer hardware & software from that era to run them.


If your Unity code requires conditional compilation symbols to be present this bit of code may come in handy. After unity compiles your scripts it executes any classes that have the InitializeOnLoad attribute. You can call the SetupConditionalCompilation method provided in the code snippet below to ensure that the conditional compilation symbols persist in your unity project. If a symbol was not present and was added it will write out a notification in the unity console.

ConditionalStartup

[InitializeOnLoad]
public class GridMappingSetup
{
    static GridMappingSetup()
    {
        var types = new[] { BuildTargetGroup.Standalone, BuildTargetGroup.WebPlayer };
        var toInclude = new[] { "CBXControls", "GridMapping", "QuickTools", "ToolService", "TileMaterialCreation" };

        SetupConditionalCompilation(types, toInclude);
    }
}

public static void SetupConditionalCompilation(BuildTargetGroup[] platformTargets, string[] symbolsToInclude)
{
    foreach (var type in platformTargets)
    {
        var hasEntry = new bool[symbolsToInclude.Length];
        var conditionals = PlayerSettings.GetScriptingDefineSymbolsForGroup(type).Trim();
        var parts = conditionals.Split(';');
        var changed = false;

        foreach (var part in parts)
        {
            for (int i = 0; i < symbolsToInclude.Length; i++)
            {
                if (part.Trim() == symbolsToInclude[i].Trim())
                {
                    hasEntry[i] = true;
                    break;
                }
            }
        }

        for (int i = 0; i < hasEntry.Length; i++)
        {
            if (!hasEntry[i])
            {
                conditionals += (String.IsNullOrEmpty(conditionals) ? String.Empty : ";") + symbolsToInclude[i];
                changed = true;
            }
        }

        PlayerSettings.SetScriptingDefineSymbolsForGroup(type, conditionals);

        if (changed)
        {
            Debug.Log(String.Format("Updated player conditional compilation symbols for {0}: {1}", type, conditionals));
        }
    }
}

Here is a C# script for visualizing render bounds. Just attach it to a game object and it will draw the render bounds of the game object and all it’s children. Handy for debugging!

Render Bounds Script Preview

public class RendererBoundsGizmo : MonoBehaviour
{
    public bool ShowCenter;

    public Color Color = Color.white;

    public bool DrawCube = true;

    public bool DrawSphere = false;

    /// <summary>
    /// When the game object is selected this will draw the gizmos
    /// </summary>
    /// <remarks>Only called when in the Unity editor.</remarks>
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = this.Color;

        // get renderer bonding box
        var bounds = new Bounds();
        var initBound = false;
        if (CBX.Utilities.Helpers.GetBoundWithChildren(this.transform, ref bounds, ref initBound))
        {
            if (this.DrawCube)
            {
                Gizmos.DrawWireCube(bounds.center, bounds.size);
            }
            if (this.DrawSphere)
            {
                Gizmos.DrawWireSphere(bounds.center, Mathf.Max(Mathf.Max(bounds.extents.x, bounds.extents.y), bounds.extents.z));
            }
        }

        if (this.ShowCenter)
        {
            Gizmos.DrawLine(new Vector3(bounds.min.x, bounds.center.y, bounds.center.z), new Vector3(bounds.max.x, bounds.center.y, bounds.center.z));
            Gizmos.DrawLine(new Vector3(bounds.center.x, bounds.min.y, bounds.center.z), new Vector3(bounds.center.x, bounds.max.y, bounds.center.z));
            Gizmos.DrawLine(new Vector3(bounds.center.x, bounds.center.y, bounds.min.z), new Vector3(bounds.center.x, bounds.center.y, bounds.max.z));
        }

        Handles.BeginGUI();
        var view = SceneView.currentDrawingSceneView;
        var pos = view.camera.WorldToScreenPoint(bounds.center);
        var size = GUI.skin.label.CalcSize(new GUIContent(bounds.ToString()));
        GUI.Label(new Rect(pos.x - (size.x / 2), -pos.y + view.position.height + 4, size.x, size.y), bounds.ToString());
        Handles.EndGUI();
    }
}

And also the code for the GetBoundsWithChildren method.

/// <summary>
/// Gets the rendering bounds of the transform.
/// </summary>
/// <param name="transform">The game object to get the bounding box for.</param>
/// <param name="pBound">The bounding box reference that will </param>
/// <param name="encapsulate">Used to determine if the first bounding box to be calculated should be encapsulated into the <see cref="pBound"/> argument.</param>
/// <returns>Returns true if at least one bounding box was calculated.</returns>
public static bool GetBoundWithChildren(Transform transform, ref Bounds pBound, ref bool encapsulate)
{
    var bound = new Bounds();
    var didOne = false;

    // get 'this' bound
    if (transform.gameObject.renderer != null)
    {
        bound = transform.gameObject.renderer.bounds;
        if (encapsulate)
        {
            pBound.Encapsulate(bound.min);
            pBound.Encapsulate(bound.max);
        }
        else
        {
            pBound.min = bound.min;
            pBound.max = bound.max;
            encapsulate = true;
        }

        didOne = true;
    }

    // union with bound(s) of any/all children
    foreach (Transform child in transform)
    {
        if (GetBoundWithChildren(child, ref pBound, ref encapsulate))
        {
            didOne = true;
        }
    }

    return didOne;
}

Big

I have released the v1.2 update to my CBX.GridMapping project.

Unity Asset Store: Asset store
Unty Forums: Fourm thread

Version Notes

Items starting with "Completed" are items that have been fully implemented as they were intended
Items starting with "Partial" are items that have only been partially implemented.

v1.2

  • Completed - CBXEditorHelpers.toolBarButtonSize need to be replaced with a setting in xml file
  • Completed - Need ability to specify in settings weather user need to hold alt ctrl or shift to draw and erase
  • Completed - For included prefabs you should have mesh generation ones as well as actual prefab *.fbx ones so the user does not wish to take advantage of mesh generation they can have option to use mesh based prefabs.
  • Completed - Should use multiple prefab list files so they can be bundled together and included with prefabs for distribution as a *.unitypackage
  • Completed - Recently used prefab list and recently used materials list should not show the name but rather just 'Select'
  • Completed - Recently used prefabs and material lists need a setting to say weather or not to show the object selection field or weather to just show a button.
  • Completed - Settings for setting the max number of items that a recently used lists can contain.
  • Completed - Need to localize all strings for grid mapping using a localization system
  • Completed - Have settings to specify the max height of the list of recent materials or prefabs
  • Completed - Categorized quick prefab selection
  • Completed - Additional prefab shapes for 2D and 3D
  • Partial - Ability to edit along different axis. Currently it only supports X/Z axis editing with layers extending into the Y plane. Partial support by granting the ability to rotate the map object and still draw
  • Completed - Have option to show recent material & prefab lists displayed as grid of buttons
  • Completed - GridMapping DrawMapInfo method uses a cloned skin from a label and makes it white for highlighting sections. You should not do this because it could cause issues if the skin is different.
  • Completed - Auto scale does not take into account rotation while drawing so a tall obj drawn with no rotation works fine but a tall object draw with 90 rotation along x causes it not to scale properly IE it does not fit within the cell dimensions. This has been fixed
  • Partial - When the map is rotated and user draws the prefabs are not rotated with the map and as such are not drawn in there proper location. This was partially fixed. Prefabs are placed where they should be but positioning the mouse over a grid cell on a map that is rotated is not exact and precice like it is when the map has no rotation. This gets exaderated when the active layer is beyond 3 layers deep. It works but it is not as acurate as I would like it to be.
  • Completed - Full setting customizability for changing grid & guideline colors etc
  • Completed - Tile material creation window needs setting in settings dialog for 'As list' check box as well as default output path etc
  • Completed - Tile material createion should have ability to flip along horiz and vert

v1.0 - v1.1

  • Initial release

Recently I needed to force the inspector to redraw itself from a piece of code outside of a Editor class. The solution I came up with was to call SetDirty on all selected objects of the type I was interested in. The inspector then picked up on the change and refreshed itself immediately. Although this code works under Unity 4 it is a hack and there may be a better way to force the inspector to redraw itself.

var objects = Selection.GetFiltered(typeof(GridMap), SelectionMode.TopLevel);
foreach (var o in objects)
{
    EditorUtility.SetDirty(o);
}

Did you know your editor scripts can acquire a preview texture for an asset? Check out the members of the AssetPreview class.


Big

My CBX.GridMapping tool for Unity has been accepted to the asset store! *Does the happy dance*  CBX.GridMapping is a in editor tool for unity that assists you in the creation of worlds that are based around a grid.

The current version of this tool does not contain a grid or tile mapping/management system. It is a in-editor creation tool only. A future update will include editor & runtime management API's.

*Temporary Homepage: http://www.createdbyx.com/page/CBXGridMapping.aspx
Google+ page: https://plus.google.com/100290581403134799105
Demonstration video: Getting started
Unity Forums Link: Unity Forums

Image tile sets are from Ari Feldman's SpriteLib (Common Public License) and are not included with this package.
http://www.widgetworx.com/widgetworx/portfolio/spritelib.html

The initial version that is on the asset store is a minimal v1.0 implementation. I am currently in the process of finalizing v1.2 features and documentation. v1.2 should be released some time in the first week of Jan 2013.

v1.2 features will include

  • Almost everything has a setting giving you the ability to customize how the tool looks and operates
  • Mouse wheel can be used to change layers
  • You can rotate the map object and draw v1.0 did not allow this.
  • Comes with mesh to code utility to convert simple meshes into C# code for procedural mesh generation
  • The quick prefab list is now categorized with a drop down menu
  • Many more prefab shapes both procedural and mesh based
  • 'Auto Center' drawing helper correctly takes into account a prefabs pivot point and positions a prefab centered to a grid cell
  • Will support multiple prefab definition files
  • Fully commented C# source code (xml documentation comments & inline code comments)
  • 95+% Of the code complies with the default StyleCop formatting settings.
  • All strings have been localized (English) with a custom built localization system

v1.0 and the up coming v1.2 are lacking certain features that are found in other popular tile mapping systems found on the asset store.

In time CBX.GridMapping will also include these list of features ...

  • A system to automatically change surrounding prefabs if certain conditions are met (Must take into account different prefab shapes)
  • A system to automatically change only the materials of surrounding prefabs if certain conditions are met
  • Formal API for developers to access and manipulate the map.
  • Ability to control where tools appear weather it be in scene view or in the inspector window
  • Integration with quick tools. A menu system I wrote that pops up a menu located around the mouse cursor.

I am also planning on making a few videos comparing UniTile, Tidy Tile Mapper, and CBX.GridMapping. The videos are intended to measure speed of the workflow for each tool and compare them when creating a specific map. This will help users decide for themselves if CBX.GridMapping is worth spending there monies on.

I have been keeping a list of about 60+ features that still need to be added to the CBX.GridMapping tool. Some are small some are large features so there is still a whole lot of work yet to do.


xDocs finally has a download

Published 12/31/2012 by createdbyx in News
Tags: ,

I created the xDocs page July 11, 2008 and I am only now realizing that I had never provided an actual download to the control.  I r phail saucie  QQ

Jebus I’m bad for doing that! I can’t believe how much stuff I have started on this site only to have it never completed.


Created by: X

Just another personal website in this crazy online world

Name of author Dean Lunz (aka Created by: X)
Computer programming nerd, and tech geek.
About Me -- Resume