- Home /
Accessing the pasted object during commandName Paste and Duplicate
Currently I'm working on a piece of code for copying and pasting certain game objects. I am using the Event.current.commandName to check for a Paste or Duplicate event. When this event occurs I want to get access to the pasted gameObject, but the selection would still be the copied element. I solved this by adding a flag to my class, signaling that we pasted an object. Now we can use OnSelectionChanged to do everything we need:
private static void HandleCopyPaste()
{
Event e = Event.current;
if (e.commandName == "Paste" || e.commandName == "Duplicate")
{
pasted = true;
}
}
static void OnSelectionChange()
{
if (pasted)
{
GameObject selected = Selection.activeGameObject;
// Do stuff
pasted = false;
}
}
My problem: When I paste two gameObjects quickly after oneanother, the first gameObject never goes through the if(pasted), missing my crucial // Do stuff, which in turn breaks my code.
Also, I doubt this method will work when handling multiple gameObjects.
My question: Is there a better way to get the gameObject(s) that is (are) being pasted? Can we maybe access the clipboard?
[edit] So basically this is what I would want:
private static void HandleCopyPaste()
{
Event e = Event.current;
if (e.commandName == "Paste" || e.commandName == "Duplicate")
{
GameObject pastedObject = GetPastedObject();
pastedObject.DoStuff();
}
}
Is there a way to access the pasted object during the commandName "Paste"?
Answer by Piflik · May 03, 2016 at 01:54 PM
Off the top of my head: Add the pasted object to a Queue. If your //Do stuff is always the same, then just loop through the Queue. (List or Stack or similar would also work equally well)
If your //Do stuff depends on the source object, you might want to define a struct to handle that.
struct PasteObject {
GameObject obj;
GameObject source;
}
Queue<PasteObject> objs = new Queue<PasteObject>();
void PasteNewObject(GameObject source) {
objs.Enque(new PasteObject {Selection.activeObject, source});
}
void HandlePastedObjects() {
while(!objs.isEmpty) {
PasteObject po = objs.Deque();
//Do stuff with po.obj and po.source
}
}
Using a queue is a great idea, but the problem I am facing is not having access to the gameObject that is being pasted. I need to erase some components on the new object, but the selection still holds the original object.
That is why I waited for OnSelectionChanged, but when copy-pasting quickly, the selection changed will not be called for every object I pasted, therefor it will not erase the components.