

fatcargo
Members-
Posts
400 -
Joined
-
Last visited
Content Type
Profiles
Forums
Developer Articles
KSP2 Release Notes
Everything posted by fatcargo
-
Thanks for reply ! I did just that (and by sheer luck i googled the answer after thinking WHERE i could set these custom paramaters). I've set a several custom variables inside a listener, which get converted/packed into string and then event handler "unpacks" the string and gets data. Lucky for me, event handler lives inside my class so all i had to send is a few ints used as indexes used with my lists/arrays. What i did was to add, for each animation event, a listener via AddComponent() with customized parameters. All listeners then send a customized message to same single event handler inside my original class. What i became aware of later, is that i was also very very lucky that for each call to AddComponent(), a new instance of listener is created and all parameters are nicely separated. If it were static and all subsequent calls to AddComponent() either failed or have overwritten previous listener, this whole thing would not be possible.
-
While making my animation plugin i started my last (pre-release) phase of adding sound support (Configuration, Animation, Control, Utility and Visual are done) I want to add sound fx to my animation(s) but my currently employed method of control/tracking animations properties can be a hit-and-miss for sound support (controlling animations looks fine for now). It works via PartModule.Update() and PartModule.OnUpdate(). These are not directly visible in PartModule (ie not suggested by VS IDE), but can be used because it inherits from Monobehaviour. After successfully doing some basic audio tests, i wanted to write an event handler that receives a reference to my class holding all needed data. And this is where i hit a wall. AnimationEvent handler is not designed to receive data in arbitrary form. There is objectReferenceParameter, but i don't know how to reference my class this way, it expects UnityEngine.Object. If example is needed, i'll try to provide a short version. Reference material
-
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Ok here it goes. The following code should be self-contained so copy/paste into IDE would work out of the box. It is derived from my code which is a mess and posting it directly would not be helpful. I had to make a separate block of code in editor just to make sure no errors creep in. This is demonstration of how to maintain top/left position of window while it changes size. No reset to coordinates given at SpawnPopupDialog(), no flickering during position update. public Vector3 popupOldPosition = Vector3.zero; public Vector2 popupOldSize = Vector2.zero; public Vector3 popupCorrectedPosition = Vector3.zero; public bool popupIsDragging = false; public bool doRefresh = false; public PopupDialog myDialog = null; public bool showDescription = false; public void ShowDialog() { myDialog = PopupDialog.SpawnPopupDialog( new MultiOptionDialog( "visible title text", "", "", HighLogic.UISkin, new Rect(0.5f, 0.5f, 300f, 300f), new DialogGUIVerticalLayout( new DialogGUIButton("Close", () => { }, true), new DialogGUIToggleButton(false, "show/hide", (b) => { showDescription = b; RecordOldPos(); }, 100f, 15f), new DialogGUILabel("long text that needs to fit inside available width of window so it has to break on multiple lines", 100f, -1f) { OptionEnabledCondition = () => { return showDescription; } } ) ), false, HighLogic.UISkin, false); myDialog.dialogToDisplay.OnResize = () => { if (!popupIsDragging && myDialog != null && doRefresh) { doRefresh = false; RestoreOldPos(); } }; EventTrigger popupDialogEvent = myDialog.gameObject.AddOrGetComponent<EventTrigger>(); EventTrigger.Entry popupBeginDrag = new EventTrigger.Entry() { eventID = EventTriggerType.BeginDrag }; popupBeginDrag.callback.AddListener((e) => { popupIsDragging = true; }); popupDialogEvent.triggers.Add(popupBeginDrag); EventTrigger.Entry popupEndDrag = new EventTrigger.Entry() { eventID = EventTriggerType.EndDrag }; popupEndDrag.callback.AddListener((e) => { popupIsDragging = false; RecordOldPos(); }); popupDialogEvent.triggers.Add(popupEndDrag); } public void RecordOldPos() { if (myDialog != null) { popupOldPosition = myDialog.RTrf.position; popupOldSize = myDialog.RTrf.rect.size; } doRefresh = true; } public void RestoreOldPos() { if (myDialog != null) { popupCorrectedPosition.x = popupOldPosition.x + (popupOldSize.x - myDialog.RTrf.rect.size.x) / 2; popupCorrectedPosition.y = popupOldPosition.y + (popupOldSize.y - myDialog.RTrf.rect.size.y) / 2; popupCorrectedPosition.z = popupOldPosition.z; myDialog.RTrf.position = popupCorrectedPosition; } } Note the use of custom added events to properly capture window position. Until i understood the coordinate system used for positioning and size of window i couldn't make heads or tails from available positional data. I'll add comments to code here instead of code box to keep it clean. "showDescription" is used to set visibility of label via toogle button. "popupIsDragging" is used for checking if dragging has ended (BeginDrag event is needed just to reinitializeset this variable. In this case it may appear superfluous, but may be necessary for more complex code that may update window contents during dragging operation). "popupOldPosition" , "popupOldSize" and "popupCorrectedPosition" are used to capture old and calculate new coordinates to maintain visually position of window while it's contents change. Now for the DRAWBACKS. The RecordOldPos() function HAS to be manually inserted into callback for any UI element that may cause window resizing event. I have not found any callback that fires just before window resize event, if there was one, it would capture all changes in one neat function. In above example a toggle button calls RecordOldPos() inside its onToggled() callback event. Note that myDialog.dialogToDisplay.OnResize() callback first sets "doRefresh" to false then calls RestoreOldPos(). Ordering is important because it may trigger another OnResize() event. During initial testing i haven't added this check and managed to crash KSP by causing self-triggering. The coordinate system used for positioning is centered inside display area, so setting window at (0,0) will put in middle. Also, a window transform is also put in center of window itself, not on any of corners. ASCII art time Deptiction of center coordinates on "screen space". X and Y are positive going right and upward. Negative coordinates move to left and below of screen's center. /|\ Y+ | ____________|___________ | | | | | | | (0,0) ------------- |-------------> X+ | | | | |______________________| Similar is with popup window's transform. It is also located at center of window and has same orientation. Now, a few words of caution. While i tested my code, i managed to get window completely outside visible area. It seems that authors intentionally added coordinate origin to center of screen, so if plugin sets window XY position to 0, it won't disappear. Also, whenever window is resized, its vital UI elements may end up outside visible area (for some rare cases for gigantic-sized windows) so it tries to reset to center, maximizing utility and minimizing loss of control. Bear in mind that modal windows will block user input and if they "fly" outside available screen space... Well, you get the picture -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Quick update : i'm still trying to find a way to keep window top/left position constant. No luck so far... -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
HA! I managed to make it clean, no more stutter when doing visibility toggle on UI element ! I'll post an example tomorrow, but for now a hint : use yourDialog.dialogToDisplay.OnResize() callback to set position with yourDialog.RTrf.position Vector3 variable. It will nicely reposition the window BEFORE it gets rendered. Oh, i also added a bool refresh flag which is set to true at point where visibility toggle runs and then clear it in OnResize(). That way, callback won't cause runaway self-triggering (hmm i'll try without that refresh flag to see if it indeed self-triggers). The only thing left (avoidable) is when hide/show happens, the whole window changes size, so top/left position still jumps. I'll try to cook up some math to compensate for it. -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Yes it is pretty much same issue - i switch visibility of label via toggle button and window gets reset to positions defined at spawn. I did manage to set it back to last position prior to switching visibility, but you can still see for a brief moment how it jumps to old position then moves back. I will do more tests to see if i can hide that visual "stutter". -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
I've made a window that has a label with multiline text and a toggle button that controls label's visibility of that label (via OptionEnabledCondition). EXAMPLE SNIPPET public bool showDescription = false; public DialogGUILabel lab = new DialogGUILabel("example text for\nmultiple\nlines") { OptionEnabledCondition = () => { return showDescription; } }; public DialogGUIToggleButton toggle = new DialogGUIToggleButton(false, "show/hide", (b) => { showDescription = b; }, 100f, 20f); When toggling label visibility, my popup window changes size as it should, but it also resets back to screen coordinates set at SpawnPopupDialog(). Can this be prevented ? I can manage repositioning the window to original coordinates, but is is way too visible and kind of ugly. For anyone interested, i used same EventTrigger() / AddListener() trick as with my jog-shuttle slider. Oh, and does anyone know how to stop ESC from closing the popup window ? I assume it can be done by intercepting ESC keypress event game-wide, though i'd like to target event stream just for my popup window. -
[Minimum KSP version - 1.11] Kerbal Attachment System (KAS) v1.12
fatcargo replied to IgorZ's topic in KSP1 Mod Releases
I'm starting to seriously doubt myself, i need sleep... Anyway i (mistakenly ?) thought that docking ports do not have as strong connection as editor-built parts. I tried looking at KAS sources to learn more but i am tired. I'll look at it later. Is there a somewhat comprehensive list of unity3d joint types mapped to KSP vanilla/modded parts ? -
[Minimum KSP version - 1.11] Kerbal Attachment System (KAS) v1.12
fatcargo replied to IgorZ's topic in KSP1 Mod Releases
Correct, but i used Konstrucion ports merely to demonstrate part of my idea, not as desired effect. I'll try to explain this ... EXAMPLE : Imagine this scenario where Konstruction ports were never invented, instead RoverDude made a plugin that allows player to arbitrarily connect any part to any vessel in flight. Player would be able to simply use its vessel in orbit to get close enough to derelict Mk1 Command Pod, right click on it and use a new option "Join to my vessel". The pod (and its Kerbal inhabitant) would be instanly added to ship. The newly attached pod would have no visible connection to player's vessel. Of course, this scenario makes no sense. But when you add a part such as Konstruction port, and a rule that docked craft can join to your vessel using only these ports, then the whole idea of joining craft/parts in flight starts to make sense. Same with my idea : join AND RELEASE parts in flight that are connected via Unity3D FixedJoint connection (this is used when building crafts in VAB/SPH), used via separate part that introduces this functionality into the game. -
[Minimum KSP version - 1.11] Kerbal Attachment System (KAS) v1.12
fatcargo replied to IgorZ's topic in KSP1 Mod Releases
Bingo! But with one important caveat : once connected, there is no way to separate joined parts. And as far as game logic regarding Konstruction ports is concerned, this is ok. What i am proposing is a feature that allows the same part connection that is reverisble (ie a part can be detached). Problem is how and when to determine which part needs to be disconnected. In KAS, this is achieved by letting player target the part using an ingame-avatar representation of himeslf/herself in game - a Kerbal Engineer on EVA using tools. If attempting to just plainly add option to every part that can be detached in flight without any representing entity, player will be confused by this inconsistency. Thus, there must be a separate part that will introduce such functionality with its rules that will make it consistent with rest of game logic. A sort of Konstrucion port with detach action. All above considering a detachable parts without Kerbal, a fully automatic operation. Same as not needing a Kerbal to dock/undock two vessels with docking ports. -
[Minimum KSP version - 1.11] Kerbal Attachment System (KAS) v1.12
fatcargo replied to IgorZ's topic in KSP1 Mod Releases
I'll try to reply with least stress/impact on work : i was asking if it would be possible to add part(s) that perform same function as Engineer on EVA. A type of port/connector (or better yet a pair of such ports) that can attach part to vessel in flight with connection that is of equal type and strength as any other part normally built in editor. Such connection would be autostrut/KJR compatible. If such connection would be implemented, it would not matter if (for example) a resource container was added in VAB/SPH or in flight. In both cases, resource container would be connected to vessel the same way. All without EVA Engineer, just parts and vessels. It could VISUALLY look like a docking port or a hooking clamp for securing payload. If this is added to KAS, it would enable "payload reintegration" to vessels for example a unmanned truck but without wobbling associated with claws, magnets or docking ports. -
[Minimum KSP version - 1.11] Kerbal Attachment System (KAS) v1.12
fatcargo replied to IgorZ's topic in KSP1 Mod Releases
A question about reintegrating payloads into craft's body/frame : is there a separate plugin from other addon or a functionality within KAS to dock/attach part to craft as it if was added in VAB/SPH, WITHOUT Engineer on EVA ? Something like weldable ports from Konstruction, but separable again ? -
[Minimum KSP version - 1.11] Kerbal Attachment System (KAS) v1.12
fatcargo replied to IgorZ's topic in KSP1 Mod Releases
Idea : synchronized winches. When dealing with bulky loads, it may be needed to perform winching operations from multiple points. But only simple start/stop/speed synchronization toggle from winch UI. Anything more complicated and it will turn into Infernal Robotics (which is, sadly, badly out of date). It may be possible to make a auto-sync function that allows player to manipulate loads by having all synced winches working as one (there is YT video about it, can't remember the link). In simpler version (one i recommend implementing, if this idea is accepted) player is responsible for positioning of winches. Lots of trial and error, but that's the name of the game. -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
While i was reading your code i realized that i already worked with lambdas in other part of my plugin. I tried too hard to make all-in-one solution for anyone to use, in my case i actually won't have problems to using refs inside anonymous functions. As for adding more triggers/listeners, i added a if- getcomponent-return line to prevent just that -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Here is the newest iteration, i adapted code from this post on unity answers site public DialogGUISlider CreateJogShuttle() { bool isDragging = false; float val = 0f; return new DialogGUISlider( setValue: () => { return isDragging ? val : 5f; }, // this one. can't set any ref or out parameters here min: 0f, max: 10f, wholeNumbers: true, width: 200, height: 10, setCallback: (float f) => { val = f; }) { OnUpdate = () => { //commented out for testing purposes //test_slider.OnUpdate = () => { }; //longwinded but reliable, good enough for my tests if (test_slider.slider.GetComponent<EventTrigger>()?.triggers.Exists(e => e.eventID == EventTriggerType.BeginDrag || e.eventID == EventTriggerType.EndDrag) ?? false) return; EventTrigger sliderEvent = test_slider.slider.gameObject.AddComponent<EventTrigger>(); EventTrigger.Entry sliderOnEndDrag = new EventTrigger.Entry(); sliderOnEndDrag.eventID = EventTriggerType.EndDrag; sliderOnEndDrag.callback.AddListener((e) => { Debug.Log("OnEndDrag\n"); isDragging = false; }); sliderEvent.triggers.Add(sliderOnEndDrag); EventTrigger.Entry sliderOnBegindDrag = new EventTrigger.Entry(); sliderOnBegindDrag.eventID = EventTriggerType.BeginDrag; sliderOnBegindDrag.callback.AddListener((e) => { Debug.Log("OnBeginDrag\n"); isDragging = true; }); sliderEvent.triggers.Add(sliderOnBegindDrag); } }; } Note that "isDragging" is updated by two event handlers, so it properly resets slider thumb. Also i used "slider" field instead of "uItem". @xEvilReeperx thanks for the example, i'll give it a try. -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Not-so-good-news-update : i made some more tests and used different approach. I want to make a function to create a jog-shuttle type of slider. I need test how it performs when called multiple times because it uses some local variables (it should be ok), but i also wanted to bind output value of slider to a float variable passed by reference, so the whole thing stays neatly inside a single function. Guess what ? "out" and "ref" variables can't be used inside anonymous functions, which is how all callbacks are implemented for slider events. Sigh... what now ? I'll keep picking at this but feel free to chime in. If all else fails, after i post the example code, whoever wants to use it will have to use class-level variables in callbacks to get usable values ... yuck. Read this stackoverflow post if insterested. -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
@maja : Thanks for the example code ! It helped me construct a working example. uItem field is indeed the right way to obtain handle to GameObject for DialogGUI element, i just used it wrong. NOTE : uItem field appears to be valid only after PopupDialog.SpawnPopupDialog() is called. Kudos for clever way of disabling further calls to Update by assigning an empty code block. However, i noticed that when calling PopupDialog.SpawnPopupDialog() multiple times, DialogGUISlider.Update() stays disabled (so for anyone trying this - if there is a problem with code not running correctly, this may be one of the reasons). @DMagic : Thanks for the idea to call default events from my custom handlers, though i still have to check logic and flow of code. Example code is working i just need to make a more robust solution. Namely, there will be multiple sliders and i need to know which one fired the event. PointerEventData contains source object fields that i can use, but not all fields are valid for all types of events, some of them are null (i've got a few NREs when experimenting). Once i clean the code i'll post what i did. -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
I've run into another problem : i want to use DialogGUISlider as a jog-shuttle control. Why ? I need a precise control over a potentially large range of values within a single UI element. The problem is that available functional callbacks for setValue and actionCallback do not provide required event handling, and i need events that fire when slider thumb is clicked-and-held-down and when it is released. I've found almost a direct example in sources of BetterManeuvering and JanitorsCloset. For start i need to know if i can attach a additional listener(s) directly to DialogGUISlider to capture events using DialogGUISlider.uiItem.gameObject.AddComponent and also what events i need to define/use to capture inputs. I found two approaches : - BetterManeuvering defines events it needs and hooks into PopupDialogController (its listener is a basic MonoBehaviour) - JanitorsCloset completely replaces default event handlers with its own (its listener inherits from MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler and IPointerExitHandler) DebugStuff could find references to thumb and container components of DialogGUISlider inside PopDialog window, so it should be possible to intercept messages for those specific event targets. I'll try to roll my own event installer/listener ofcourse but i'd like some advice on doing this properly. EDIT : I was wrong to try using DialogGUISlider.uiItem, its null at runtime... -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Ohhh i think i solved it ! When using 9-slice UI Sprite, few things need to be done : 1. Image to be loaded as texture needs to have small enough corners (usually rounded) so that rendering engine can use it on smaller elements (like the before mentioned scrollbar thumb) 2. For proper display image needs to have alpha channel, otherwise all pixels will fill up the UI element box and it won't look good 3. Border parameter needs to reflect actual size in pixels for borders (though you can put fractionals too, its a float so tweak it your liking) 4. Pixels Per Unit parameter works ok at value of 100, if lower the displayed image will degrade Note that if corners needs to be shown with soft(er) edges, try adding/setting anti-aliasing in image processing software (also, the below code example does it's own smoothing which really isn't sufficient on it's own). public int pixelsPerUnit = 100; // best to keep it at 100 public uint extrude = 0; //don't know what this does, 0 is ok //these are the magic stuff needed for 9-slice to work public float border_left = 8f; // choose how many pixels from image edge need to be allocated for border / corner public float border_bottom = 8f; public float border_right = 8f; public float border_top = 8f; public Sprite ImageSprite(string imagePath) { Texture2D imageTexture = GameDatabase.Instance.GetTexture(imagePath, false); // load image imageTexture.filterMode = FilterMode.Trilinear; // try smoothing, not overly spectacular imageTexture.wrapMode = TextureWrapMode.Clamp; // not sure this is required imageTexture.Apply(); return Sprite.Create( imageTexture, new Rect(0, 0, imageTexture.width, imageTexture.height), new Vector2(0.5f, 0.5f), // pivot aka center of sprite pixelsPerUnit, extrude, SpriteMeshType.Tight, new Vector4(border_left, border_bottom, border_right, border_top) // important stuff ); } Ahh yes the SpriteMeshType.Tight tells what to do with empty space around texture, if using entire image this has no effect. PS: As so many times before, i was actually fighting my own stupidity - while tinkering with input values for borders i forgot to properly transfer parameters and it ended up using (1,1,1,1), so i spent couple of days staring at the screen like a statue for two hours. -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Just as i considered texture rescaling to be resolved, i stumbled upon something interesting and it just bugs me. I have made a function that loads image, then "stretches" it by creating a new texture of desired size, copies all four corners, then copies all borders between corners and finally fills in the center. Not the most elegant (or short) function, but it does the job. Then, i tried the same for thumb button on DialogGUIScrollList and found that, depending on given content, thumb size changes. This in turn deforms the loaded image. Ofcourse i wanted to use OnResize event, but that d*mn thing triggers even with plain scrolling user action. Too expensive, too bulky and will most likely attract a Kraken with that many memory reallocations / garbage collections. So, i yet again i turned to KSP built-in style HighLogic.UISkin.verticalScrollbarThumb . I assigned it to DialogGUIScrollList UIStyle and lo and behold - it rescaled button with no extra code, all rounded corners perfectly preserved, it even has a simple gradient. So, i tried to copy the entire UIStyle and after some tests found that this specific resizing type is built inside Sprite itself. I used HighLogic.UISkin.verticalScrollbarThumb.normal.background (which is a KSP built-in Sprite) in my own UIStyle and there was the smoking gun. So what is bugging me now, is how i can replicate same behaviour in my custom Sprite. There are parameters for Sprite.Create() as mentioned on this Unity3D help page public static Sprite Create(Texture2D texture, Rect rect, Vector2 pivot, float pixelsPerUnit, uint extrude, SpriteMeshType meshType, Vector4 border); I'm out of my depth here. Are there any ides how to this ? This stackoverflow post demonstrates pretty much exactly what i'm trying to do (sans putting the texture in 3D space). Another example is at Unity3D docs GUI Texture (Legacy UI Component) Ahh one more thing : it appears to be referenced as "9-slice" UI image (found at this post from answers.unity.com, reading it now and trying that solution ! Will respond tomorrow). -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Found solution for this, though in hindsight it is not what i'm after. I'll have to enforce PNGs to have required width and height. If anyone still wishes to do texture resizing, source is available in this stackexchange post . Note that is quite crude for larger scaling factors, but for minor pixel-by-pixel adjustments it works ok. -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
I can't solve UI Texture2D rescaling problem. I have an image glyph in PNG format that i want to load and then rescale to fit a specific constraints for plugin code to work on it. Problem is that at every time i try, KSP (or to be more precise - Unity3D under the hood) refuses or outright quietly fails to resize a texture. Debug log either shows "can't resize a compressed texture" or texture dimensions drop to 0 (!?) after resize. I've searched and found that apparently Texture2D.Resize() method does NOT rescale a texture, it only changes the Color[] array size. If the above is true, this is ... ridiculous. Anyway, here is a snippet of troublesome code: Texture2D sourceTexture = GameDatabase.Instance.GetTexture(imagePath, false); sourceTexture.Resize(10, 15, TextureFormat.DXT1, false); // trying to bypass compressed texture resize failure warning sourceTexture.Resize(10, 15); // does not work for me sourceTexture.Apply(); Note that, resizing dimensions 10 and 15 are purely for demonstration purposes. Failing above, i could enforce failure if loaded PNG is not within constraints. Barring the Resize() problem, my code nicely loads and manipulates the PNG for display in UI, there are no problems for now. -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Found it. Thanks ! I copied code from SettingsWindowView .cs and i found what i missed : DialogGUIVerticalLayout was added to box element with all parameters. So it worked ! -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
I was away for several days. I searched at github for "SettingsWindowView" and " DialogGUIBox", neither has been found. -
PopupDialog and the DialogGUI classes
fatcargo replied to DMagic's topic in KSP1 C# Plugin Development Help and Support
Originally, while i was learning about UI there were two competing approaches with KSP Assets and DialogGUI. First i tried creating an asset as per instructions but have given up, then i tried DialogGUI which worked. My confusion arised when i thought that panel object used in UI design inside unity editor had an equivalent method in C# and i mistakenly associated it to DialogGUIBox. I was wrong. Anyway, i've got all i need from various coding experiments and have continued development.