forked from Unity-Technologies/UnityCsReference
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUnityEngineObject.bindings.cs
More file actions
394 lines (310 loc) · 15.6 KB
/
Copy pathUnityEngineObject.bindings.cs
File metadata and controls
394 lines (310 loc) · 15.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
// Unity C# reference source
// Copyright (c) Unity Technologies. For terms of use, see
// https://unity3d.com/legal/licenses/Unity_Reference_Only_License
using System;
using System.Runtime.InteropServices;
using UnityEngine.Bindings;
using UnityEngine.Scripting;
using UnityEngineInternal;
using uei = UnityEngine.Internal;
namespace UnityEngine
{
// Bit mask that controls object destruction and visibility in inspectors
[Flags]
public enum HideFlags
{
// A normal, visible object. This is the default.
None = 0,
// The object will not appear in the hierarchy and will not show up in the project view if it is stored in an asset.
HideInHierarchy = 1,
// It is not possible to view it in the inspector
HideInInspector = 2,
// The object will not be saved to the scene.
DontSaveInEditor = 4,
// The object is not be editable in the inspector
NotEditable = 8,
// The object will not be saved when building a player
DontSaveInBuild = 16,
// The object will not be unloaded by UnloadUnusedAssets
DontUnloadUnusedAsset = 32,
DontSave = 4 + 16 + 32,
// A combination of not shown in the hierarchy and not saved to to scenes.
HideAndDontSave = 1 + 4 + 8 + 16 + 32
}
[StructLayout(LayoutKind.Sequential)]
[RequiredByNativeCode(GenerateProxy = true)]
[NativeHeader("Runtime/Export/Scripting/UnityEngineObject.bindings.h")]
[NativeHeader("Runtime/GameCode/CloneObject.h")]
[NativeHeader("Runtime/SceneManager/SceneManager.h")]
public partial class Object
{
IntPtr m_CachedPtr;
private int m_InstanceID;
#pragma warning disable 169
private string m_UnityRuntimeErrorString;
internal static int OffsetOfInstanceIDInCPlusPlusObject = -1;
const string objectIsNullMessage = "The Object you want to instantiate is null.";
const string cloneDestroyedMessage = "Instantiate failed because the clone was destroyed during creation. This can happen if DestroyImmediate is called in MonoBehaviour.Awake.";
[System.Security.SecuritySafeCritical]
public unsafe int GetInstanceID()
{
//Because in the player we dissalow calling GetInstanceID() on a non-mainthread, we're also
//doing this in the editor, so people notice this problem early. even though technically in the editor,
//it is a threadsafe operation.
EnsureRunningOnMainThread();
return m_InstanceID;
}
public override int GetHashCode()
{
//in the editor, we store the m_InstanceID in the c# objects. It's actually possible to have multiple c# objects
//pointing to the same c++ object in some edge cases, and in those cases we'd like GetHashCode() and Equals() to treat
//these objects as equals.
return m_InstanceID;
}
public override bool Equals(object other)
{
Object otherAsObject = other as Object;
// A UnityEngine.Object can only be equal to another UnityEngine.Object - or null if it has been destroyed.
// Make sure other is a UnityEngine.Object if "as Object" fails. The explicit "is" check is required since the == operator
// in this class treats destroyed objects as equal to null
if (otherAsObject == null && other != null && !(other is Object))
return false;
return CompareBaseObjects(this, otherAsObject);
}
// Does the object exist?
public static implicit operator bool(Object exists)
{
return !CompareBaseObjects(exists, null);
}
static bool CompareBaseObjects(UnityEngine.Object lhs, UnityEngine.Object rhs)
{
bool lhsNull = ((object)lhs) == null;
bool rhsNull = ((object)rhs) == null;
if (rhsNull && lhsNull) return true;
if (rhsNull) return !IsNativeObjectAlive(lhs);
if (lhsNull) return !IsNativeObjectAlive(rhs);
return lhs.m_InstanceID == rhs.m_InstanceID;
}
private void EnsureRunningOnMainThread()
{
if (!CurrentThreadIsMainThread())
throw new System.InvalidOperationException("EnsureRunningOnMainThread can only be called from the main thread");
}
static bool IsNativeObjectAlive(UnityEngine.Object o)
{
if (o.GetCachedPtr() != IntPtr.Zero)
return true;
//Ressurection of assets is complicated.
//For almost all cases, if you have a c# wrapper for an asset like a material,
//if the material gets moved, or deleted, and later placed back, the persistentmanager
//will ensure it will come back with the same instanceid.
//in this case, we want the old c# wrapper to still "work".
//we only support this behaviour in the editor, even though there
//are some cases in the player where this could happen too. (when unloading things from assetbundles)
//supporting this makes all operator== slow though, so we decided to not support it in the player.
//
//we have an exception for assets that "are" a c# object, like a MonoBehaviour in a prefab, and a ScriptableObject.
//in this case, the asset "is" the c# object, and you cannot actually pretend
//the old wrapper points to the new c# object. this is why we make an exception in the operator==
//for this case. If we had a c# wrapper to a persistent monobehaviour, and that one gets
//destroyed, and placed back with the same instanceID, we still will say that the old
//c# object is null.
if (o is MonoBehaviour || o is ScriptableObject)
return false;
return DoesObjectWithInstanceIDExist(o.GetInstanceID());
}
System.IntPtr GetCachedPtr()
{
return m_CachedPtr;
}
// The name of the object.
public string name
{
get { return GetName(this); }
set { SetName(this, value); }
}
// Clones the object /original/ and returns the clone.
[TypeInferenceRule(TypeInferenceRules.TypeOfFirstArgument)]
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation)
{
CheckNullArgument(original, objectIsNullMessage);
if (original is ScriptableObject)
throw new ArgumentException("Cannot instantiate a ScriptableObject with a position and rotation");
var obj = Internal_InstantiateSingle(original, position, rotation);
if (obj == null)
throw new UnityException(cloneDestroyedMessage);
return obj;
}
// Clones the object /original/ and returns the clone.
[TypeInferenceRule(TypeInferenceRules.TypeOfFirstArgument)]
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent)
{
if (parent == null)
return Instantiate(original, position, rotation);
CheckNullArgument(original, objectIsNullMessage);
var obj = Internal_InstantiateSingleWithParent(original, parent, position, rotation);
if (obj == null)
throw new UnityException(cloneDestroyedMessage);
return obj;
}
// Clones the object /original/ and returns the clone.
[TypeInferenceRule(TypeInferenceRules.TypeOfFirstArgument)]
public static Object Instantiate(Object original)
{
CheckNullArgument(original, objectIsNullMessage);
var obj = Internal_CloneSingle(original);
if (obj == null)
throw new UnityException(cloneDestroyedMessage);
return obj;
}
// Clones the object /original/ and returns the clone.
[TypeInferenceRule(TypeInferenceRules.TypeOfFirstArgument)]
public static Object Instantiate(Object original, Transform parent)
{
return Instantiate(original, parent, false);
}
[TypeInferenceRule(TypeInferenceRules.TypeOfFirstArgument)]
public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace)
{
if (parent == null)
return Instantiate(original);
CheckNullArgument(original, objectIsNullMessage);
var obj = Internal_CloneSingleWithParent(original, parent, instantiateInWorldSpace);
if (obj == null)
throw new UnityException(cloneDestroyedMessage);
return obj;
}
public static T Instantiate<T>(T original) where T : UnityEngine.Object
{
CheckNullArgument(original, objectIsNullMessage);
var obj = (T)Internal_CloneSingle(original);
if (obj == null)
throw new UnityException(cloneDestroyedMessage);
return obj;
}
public static T Instantiate<T>(T original, Vector3 position, Quaternion rotation) where T : UnityEngine.Object
{
return (T)Instantiate((Object)original, position, rotation);
}
public static T Instantiate<T>(T original, Vector3 position, Quaternion rotation, Transform parent) where T : UnityEngine.Object
{
return (T)Instantiate((Object)original, position, rotation, parent);
}
public static T Instantiate<T>(T original, Transform parent) where T : UnityEngine.Object
{
return Instantiate<T>(original, parent, false);
}
public static T Instantiate<T>(T original, Transform parent, bool worldPositionStays) where T : UnityEngine.Object
{
return (T)Instantiate((Object)original, parent, worldPositionStays);
}
// Removes a gameobject, component or asset.
[NativeMethod(Name = "Scripting::DestroyObjectFromScripting", IsFreeFunction = true, ThrowsException = true)]
public extern static void Destroy(Object obj, [uei.DefaultValue("0.0F")] float t);
[uei.ExcludeFromDocs]
public static void Destroy(Object obj)
{
float t = 0.0F;
Destroy(obj, t);
}
// Destroys the object /obj/ immediately. It is strongly recommended to use Destroy instead.
[NativeMethod(Name = "Scripting::DestroyObjectFromScriptingImmediate", IsFreeFunction = true, ThrowsException = true)]
public extern static void DestroyImmediate(Object obj, [uei.DefaultValue("false")] bool allowDestroyingAssets);
[uei.ExcludeFromDocs]
public static void DestroyImmediate(Object obj)
{
bool allowDestroyingAssets = false;
DestroyImmediate(obj, allowDestroyingAssets);
}
// Returns a list of all active loaded objects of Type /type/.
[TypeInferenceRule(TypeInferenceRules.ArrayOfTypeReferencedByFirstArgument)]
[FreeFunction("UnityEngineObjectBindings::FindObjectsOfType")]
public extern static Object[] FindObjectsOfType(Type type);
// Makes the object /target/ not be destroyed automatically when loading a new scene.
[FreeFunction("GetSceneManager().DontDestroyOnLoad")]
public extern static void DontDestroyOnLoad(Object target);
// // Should the object be hidden, saved with the scene or modifiable by the user?
public extern HideFlags hideFlags { get; set; }
//*undocumented* deprecated
// We cannot properly deprecate this in C# right now, since the optional parameter creates
// another method calling this, which creates compiler warnings when deprecated.
[Obsolete("use Object.Destroy instead.")]
public static void DestroyObject(Object obj, [uei.DefaultValue("0.0F")] float t)
{
Destroy(obj, t);
}
[Obsolete("use Object.Destroy instead.")]
[uei.ExcludeFromDocs]
public static void DestroyObject(Object obj)
{
float t = 0.0F;
Destroy(obj, t);
}
//*undocumented* DEPRECATED
[Obsolete("warning use Object.FindObjectsOfType instead.")]
[FreeFunction("UnityEngineObjectBindings::FindObjectsOfType")]
public extern static Object[] FindSceneObjectsOfType(Type type);
//*undocumented* DEPRECATED
[Obsolete("use Resources.FindObjectsOfTypeAll instead.")]
[FreeFunction("UnityEngineObjectBindings::FindObjectsOfTypeIncludingAssets")]
public extern static Object[] FindObjectsOfTypeIncludingAssets(Type type);
public static T[] FindObjectsOfType<T>() where T : Object
{
return Resources.ConvertObjects<T>(FindObjectsOfType(typeof(T)));
}
public static T FindObjectOfType<T>() where T : Object
{
return (T)FindObjectOfType(typeof(T));
}
[System.Obsolete("Please use Resources.FindObjectsOfTypeAll instead")]
public static Object[] FindObjectsOfTypeAll(Type type)
{
return Resources.FindObjectsOfTypeAll(type);
}
static private void CheckNullArgument(object arg, string message)
{
if (arg == null)
throw new System.ArgumentException(message);
}
// Returns the first active loaded object of Type /type/.
[TypeInferenceRule(TypeInferenceRules.TypeReferencedByFirstArgument)]
public static Object FindObjectOfType(System.Type type)
{
Object[] objects = FindObjectsOfType(type);
if (objects.Length > 0)
return objects[0];
else
return null;
}
// Returns the name of the game object.
public override string ToString()
{
return ToString(this);
}
public static bool operator==(Object x, Object y) { return CompareBaseObjects(x, y); }
public static bool operator!=(Object x, Object y) { return !CompareBaseObjects(x, y); }
[NativeMethod(Name = "Object::GetOffsetOfInstanceIdMember", IsFreeFunction = true, IsThreadSafe = true)]
extern static int GetOffsetOfInstanceIDInCPlusPlusObject();
[NativeMethod(Name = "CurrentThreadIsMainThread", IsFreeFunction = true, IsThreadSafe = true)]
extern static bool CurrentThreadIsMainThread();
[FreeFunction("CloneObject")]
extern static Object Internal_CloneSingle(Object data);
[FreeFunction("CloneObject")]
extern static Object Internal_CloneSingleWithParent(Object data, Transform parent, bool worldPositionStays);
[FreeFunction("InstantiateObject")]
extern static Object Internal_InstantiateSingle(Object data, Vector3 pos, Quaternion rot);
[FreeFunction("InstantiateObject")]
extern static Object Internal_InstantiateSingleWithParent(Object data, Transform parent, Vector3 pos, Quaternion rot);
[FreeFunction("UnityEngineObjectBindings::ToString")]
extern static string ToString(Object obj);
[FreeFunction("UnityEngineObjectBindings::GetName")]
extern static string GetName(Object obj);
[FreeFunction("UnityEngineObjectBindings::SetName")]
extern static void SetName(Object obj, string name);
[NativeMethod(Name = "UnityEngineObjectBindings::DoesObjectWithInstanceIDExist", IsFreeFunction = true, IsThreadSafe = true)]
internal extern static bool DoesObjectWithInstanceIDExist(int instanceID);
[VisibleToOtherModules]
[FreeFunction("UnityEngineObjectBindings::FindObjectFromInstanceID")]
internal extern static Object FindObjectFromInstanceID(int instanceID);
}
}