You can use the GameObject Flags to have it behave in different ways. This is especially useful when you're creating the GameObject via code. See below on how to use the GameObject.Flags enum property.
GameObject.Flags = (GameObjectFlags)128;
//or
GameObject.Flags = GameObjectFlags.DontDestroyOnLoad;
None = 0,
/// Hide this object in heirachy/inspector
Hidden = 1,
/// Don't save this object to disk, or when duplicating
NotSaved = 2,
/// Auto created - it's a bone, driven by animation
Bone = 4,
/// Auto created - it's an attachment
Attachment = 8,
/// There's something wrong with this
Error = 16,
/// Loading something
Loading = 32,
/// Is in the process of deserializing
Deserializing = 64,
/// When loading a new scene, keep this gameobject active
DontDestroyOnLoad = 128,
/// Keep local - don't network this object as part of the scene snapshot
NotNetworked = 256,
/// In the process of refreshing from the network
[Obsolete]
Refreshing = 512,
/// Stops animation stomping the bone, will use the bone's local position
ProceduralBone = 1024,
/// Only exists in the editor. Don't spawn it in game.
EditorOnly = 2048,
/// Ignore the parent transform. Basically, position: absolute for gameobjects.
Absolute = 4096,
/// The position of this object is controlled by by physics - usually via a RigidBody component
PhysicsBone = 8192,
/// Stops this object being interpolated, either via the network system or the physics system
NoInterpolation = 16384