How to add script to gameObject by script?
Hi there,
I would like to add Script to my MainController gameObject by using script. I have a powerup object which has PowerUp class attached to it, in PowerUp class I want to have a public property where I could assign any script in editor, example (pseudo):
public Script scriptToAdd;
Then, I want to do something like this once powerup is destroyed:
public Script scriptToAdd;
void OnDestroy()
{
MainController.AddComponen(scriptToAdd);
}
But there is no Script type, I found out that if I use:
public Object scriptToAdd;
Then I can drag and drop script to powerup object but I can't assign it to mainController, how could I do that? Many thanks!
Answer by unit_nick · Sep 21, 2017 at 01:34 PM
public UnityEngine.Object scriptToAdd;
void OnDestroy()
{
MainController.AddComponent(Type.GetType(scriptToAdd.name + ", Assembly-CSharp"));
}
here's proof that it works if implemented correctly
/*
* To see this work just create a new project
* and attach this script to an empty object.
*
* If you plan to build it you will need to attach
* it to a 3D object.
*
* You can add scripts to the tile & player by
* drag & drop in the inspector fields of this script.
*/
using UnityEngine;
using System;
public class CreateScene : MonoBehaviour {
public UnityEngine.Object _tileScript;
public UnityEngine.Object _playerScript;
private GameObject _tile;
private GameObject _player;
private void Start()
{
CreateTile();
CreatePlayer();
}
private void CreateTile()
{
_tile = GameObject.CreatePrimitive(PrimitiveType.Plane);
_tile.name = "Tile";
_tile.GetComponent<Renderer>().material.color = Color.black;
if (_tileScript != null)
_tile.AddComponent(Type.GetType(_tileScript.name + ", Assembly-CSharp"));
}
private void CreatePlayer()
{
_player = GameObject.CreatePrimitive(PrimitiveType.Capsule);
_player.name = "Player";
_player.transform.position += new Vector3(0f, 1f, 0f);
_player.transform.rotation = Quaternion.Euler(0f, 180f, 0f);
_player.AddComponent<Rigidbody>().useGravity = true;
_player.GetComponent<Rigidbody>().constraints = (RigidbodyConstraints)122;
if (_playerScript != null)
_player.AddComponent(Type.GetType(_playerScript.name + ", Assembly-CSharp"));
GameObject visor = GameObject.CreatePrimitive(PrimitiveType.Cube);
visor.name = "Visor";
visor.transform.parent = _player.transform;
visor.transform.localPosition = new Vector3(0f, 0.5f, 0.24f);
visor.transform.localScale = new Vector3(0.95f, 0.25f, 0.5f);
visor.GetComponent<Renderer>().material.color = Color.black;
}
}
.
using UnityEngine;
public class PlayerScript : MonoBehaviour
{
public float _maxDistance = 5f;
private Transform _tile;
private Vector3 _tileOffset;
private void Start()
{
_tile = GameObject.Find("Tile").transform;
_tileOffset = transform.position;
}
private void Update()
{
// turn player
transform.Rotate(Vector3.up * Input.GetAxis("Horizontal"), Space.World);
// move player
transform.position += transform.forward * 3 * Input.GetAxis("Vertical") * Time.deltaTime;
// move tile with player
Vector3 zeroPosition = transform.position - _tileOffset;
float distance = Vector3.Distance(zeroPosition, _tile.position);
if (distance >= _maxDistance)
{
// change environment
_tile.position = Vector3.MoveTowards(_tile.position, zeroPosition, distance);
}
}
}
Yes it works, sorry I misinterpreted your suggestion and thought that you misspelled "Type.GetType" because Unity suggested to use "Types.GetType", now everything is working and I found that + ", Assembly-CSharp" is not necessary:)
and I found that + ", Assembly-CSharp" is not necessary:)
Good to know.
Answer by Hellium · Sep 21, 2017 at 01:19 PM
Instead of Script
, use Component
or MonoBehaviour
public Component scriptToAdd;
void OnDestroy()
{
MainController.AddComponen(scriptToAdd);
}