Skip to main content

Making Multiple Instances of Windows With Same Window Method

So when developing a small little web-player, I ran into the problem of trying to render multiple instances of the same window function.

My plan was for my user interface component to iterate through all the thought components and for each thought, render its contents in a new window. The windows need to be draggable also.

My first attempt of this implementation failed.

  Rect thoughtRect = new Rect(20, 20, 200, 100);
  void OnGUI(){
    for (int i = 0; i < allthoughts.Length; i++){
      thoughtRect = GUI.Window(0+i, thoughtRect, DoThoughtWindow, ""+allthoughts[i].GetContent());
    }
  }
  
  
    void DoThoughtWindow(int windowID) {
        
        GUI.DragWindow(new Rect(0, 0, 10000, 10000));
    }

For those who don't see the problem with this, I'll explain.

All three windows are using the same Rect thoughtRect so all the windows are drawn on top of eachother. You might think this won't pose a problem due to the windows being draggable, you can just move one away from the other, but this is Unity's GUI class, it's not fun. The GUI.DragWindow adjusts the thoughtRect, which in turn moves all 3 windows at once, still keeping them on top of each other.

So on my second attempt of implementing my feature, I got it thankfully. I probably coded my program differently from what others would, but I hope at-least it might give you an idea to fix a problem now or in the future.

In my thought class, I made a variable "Rect positionOnScreen", which keeps up of that thoughts position. I've also added two new methods in the thought class.

One, GetPosition(), returns a Rect, the positionOnScreen;

The other SetPosition(), is called to set the new Rect in the Though class's positionOnScreen.

 When it gets to a certain thought in the for statement, it sets that certain thought to the currentThought. The point in this is so the DoThoughtWindow method has something to reference when its rendering it's contents. ***Notice currentThought = allthoughts[i];  is called BEFORE the DoThoughtWindow() is***
     Thought currentThought;  
     void OnGUI(){  
         for (int i = 0; i < allthoughts.Length; i++){  
             currentThought = allthoughts[i];  
             currentThought.SetPosition(GUI.Window(0+i, currentThought.GetPosition(), DoThoughtWindow, ""+currentThought.GetTitle()));  
         }  
     }  
       
       
   void DoThoughtWindow(int windowID) {  
     if (GUI.Button(new Rect(currentThought.GetPosition().width-120, currentThought.GetPosition().height-30, 100, 20), "Edit")){  
       Debug.Log ("We need to edit this");  
     }  
       
         GUI.Box(new Rect(10,25 ,currentThought.GetPosition().width - 20,currentThought.GetPosition().height-65),"");  
           
     GUI.DragWindow(new Rect(0, 0, 10000, 10000));  
   }  


My thought class so far in case you want to look at it yourself.

 using UnityEngine;  
 using System.Collections;  
 using System.Collections.Generic;  
   
 public class Thought : MonoBehaviour {  
       
     string thoughtTitle = "Thought";  
     public string thoughtContent = "Substance Goes Here";  
     List<GameObject> connectedThoughts = new List<GameObject>();  
     Rect positionOnScreen = new Rect(20, 20, 200, 200);  
       
       
     // Use this for initialization  
     void Start () {  
       
     }  
       
     // Update is called once per frame  
     void Update () {  
       
     }  
       
   public string GetContent(){  
         return thoughtContent;  
     }  
       
     public string GetTitle(){  
         return thoughtTitle;  
     }  
       
     public Rect GetPosition(){  
         return positionOnScreen;      
     }  
       
     public void SetPosition(Rect newPos){  
         positionOnScreen = newPos;  
     }  
       
   
 }  
   

And a look at it being rendered.



Comments

  1. Hello, I'm with this problem, but I can't set your code in my app.. First of all, who is this allthoughts? I imagine that is an array of Toughts, but where did you declare it? And how? I'm trying to set toughts objects in the allthoughts, but I'm getting a null exception when accessing them. Please, you're the only one who tells about it in whole internet and I'm desperate!

    ReplyDelete

Post a Comment

Popular posts from this blog

How To Import and Use Fonts

-Made by Chrome Fx Films

To use different fonts in your game, your going to have to acquire some fonts. You can go somewhere like 1001 free fonts and download ones you like and want to use.

When you download the file, you'll need to extract the file if its in  a .zip

The text file should have the extension .ttf. If you text files have a FFIL extension, simply rename the font file (yourname.ttf).
Drag the text file into unity to import. By default the Character variable should be labeled Dynamic.

The Dynamic setting means  that Unity won't pre-generate the texture, so if you look at your material containing your font, It probably will be blank. (read more here)
Now your over all objective should be getting your font to look like this (unless you prefer dynamic):
Where the characters of the font are not jumbled up and visible.
Now usually all you have to do to achieve this is change the Character variable from Dynamic to Unicode.
and that should work.
Now what some people over…

Handling Music and Sound Effects In Your Games

Initiative  While developing Treva's Adventure I had to figure out a way to handle multiple music tracks and sound effects in a clean manner or suffer horribly.  What was going to help me achieve a simple solution was taking all the different sounds and centralizing them in a single class in order to black box them.  Any other code trying to play a sound wouldn't even know the sound file's name.  All code trying to play a music track would reference a enum that defines all the track names.
Defining The Class Creating The Enum When I first started defining types in my enumeration,  I was naming the types to be exactly like the file name.  For a scary sound effect I had found a file named "ghost breath".  So around my code would be scattered lines like SoundManager.Play(SoundEffectType.GhostBreath);  This was fine until I found a sound that better fit the situation it was being used in,  and decided to use "ghost breath" for a different situation like a …

Don't Destroy On Load..

So if you want to keep an object or script that keeps up variables (or for any other reason) when you go from scene to scene, you need to attach a don't destroy on load static function, which goes something like this:

function Awake () {
    DontDestroyOnLoad (transform.gameObject);
}

The Awake function is call only once, when all the objects in the scene have been created. Read more about it here.

DontDestroyOnLoad has what ever is in the ( ) to not be destroyed when creating a new scene.

(transform.gameObject) is what will not be destroyed when the new scene is loaded, in this case, it will be the game object and all it's children the script is attached to.