I'm a beginner in Unity, so...
I want to change the sprite of a Gameobject that is in another scene, that is not the one i'm using
This is the code from the first scene, that i want to get the Gameobject with the tag "iman", to the second scene
public class Gravidade : Move
{
void OnEnable ()
{
rigid = GetComponent<Rigidbody2D> ();
}
// Use this for initialization
void Start ()
{
efeito.SetActive (false);
iman_pos = GameObject.FindGameObjectWithTag ("iman").transform.position;
imanbase_pos = GameObject.FindGameObjectWithTag ("imanbase").transform.position;
targetRotation = transform.rotation;
vidas = 3;
coins = 0;
//vidas_text = GetComponent<Text>();
//GUIText vidas_text = GameObject.FindWithTag("vidas").GetComponent<GUIText>() as GUIText;
rend = GetComponent<Renderer> ();
}
// Update is called once per frame
void Update ()
{
backgrounds = GameObject.FindGameObjectsWithTag ("background");
obstaculos = GameObject.FindGameObjectsWithTag ("obstaculos");
allcoins = GameObject.FindGameObjectsWithTag ("coins");
allvidas = GameObject.FindGameObjectsWithTag ("vidas123");
powerups = GameObject.FindGameObjectsWithTag ("powerup");
float dist = 1 / (iman_pos.y - imanbase_pos.y - 2);
bool space = Input.GetKeyUp ("space");
if (/*Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended */ space && vidas > 0 && lose == false) {
PlaySound (0);
magnetismo = !magnetismo;
targetRotation *= Quaternion.AngleAxis (180, Vector2.left);
lose_text.text = "";
}
transform.rotation = Quaternion.Lerp (transform.rotation, targetRotation, 10f * 0.5f * Time.deltaTime);
if (magnetismo) {
velocity += gravityModifier * Physics2D.gravity * Time.deltaTime - (dist * dist * Physics2D.gravity * amplitudeOsc);
rigid.velocity = velocity;
//nbTouches = 0;
} else {
velocity += gravityModifier * Physics2D.gravity * Time.deltaTime;
rigid.velocity = velocity;
//nbTouches = 0;
}
if (Mathf.Abs (velocity.y) > maxVelocity) {
velocity.Normalize ();
velocity = velocity * maxVelocity;
}
//Debug.Log(velocity);
if (iman_pos.y + 2.5f < imanbase_pos.y + 0.8f)
iman_pos.y = imanbase_pos.y;
if (iman_pos.y + 2.5f > tecto.y + 2.5f)
iman_pos.y = imanbase_pos.y;
//Time.timeScale = 0;
//rigid.velocity = velocity;
//Debug.Log (dist);
}
/*private void OnCollisionEnter2D(Collision2D collision)
{
//Debug.Log ("Perdeste!!");
//Time.timeScale = 0;
}*/
void OnTriggerEnter2D (Collider2D other)
{
if (other.tag == "coins") {
PlaySound (3);
Destroy (other.gameObject);
coins = coins + 1;
coins_text.text = "x" + coins;
}
if (other.tag == "obstaculos" && bater == true) {
//Destroy (other.gameObject);
if (vidas > 0) {
PlaySound (1);
vidas = vidas - 1;
vidas_text.text = "x" + vidas;
//Debug.Log (vidas);
Destroy (other.gameObject);
BlinkPlayer (3);
if (vidas == 0) {
PlaySound (2);
Time.timeScale = 0;
losemenu.SetActive (true);
//SceneManager.LoadScene (0);
}
}
}
if (other.tag == "imanbase" || other.tag == "tecto") {
lose = !lose;
PlaySound (2);
Time.timeScale = 0;
losemenu.SetActive (true);
//SceneManager.LoadScene (0);
}
if (other.tag == "vidas123") {
PlaySound (4);
vidas = vidas + 1;
vidas_text.text = "x" + vidas;
Destroy (other.gameObject);
}
if (other.tag == "passar nivel") {
Time.timeScale = 0;
lose_text.text = "Victory!";
//SceneManager.LoadScene (0);
}
if (other.tag == "powerup") {
Destroy (other.gameObject);
StartCoroutine (pw ());
}
}
void PlaySound (int clip)
{
GetComponent<AudioSource> ().clip = audioClip [clip];
GetComponent<AudioSource> ().Play ();
}
void BlinkPlayer (int numBlinks)
{
StartCoroutine (DoBlinks (numBlinks, 0.2f));
}
IEnumerator DoBlinks (int numBlinks, float seconds)
{
for (int i = 0; i < numBlinks * 2; i++) {
rend.enabled = !rend.enabled;
yield return new WaitForSeconds (seconds);
}
rend.enabled = true;
}
IEnumerator pw ()
{
float timePassed = 0;
while (timePassed < 3) {
efeito.SetActive (true);
bater = false;
foreach (GameObject back in backgrounds) {
back.GetComponent<Move> ().speed = 15.0f;
}
foreach (GameObject obs in obstaculos) {
obs.GetComponent<Move> ().speed = 15.0f;
}
foreach (GameObject ac in allcoins) {
ac.GetComponent<Move> ().speed = 15.0f;
}
foreach (GameObject vd in allvidas) {
vd.GetComponent<Move> ().speed = 15.0f;
}
foreach (GameObject pu in powerups) {
pu.GetComponent<Move> ().speed = 15.0f;
}
timePassed += Time.deltaTime;
//Debug.Log (timePassed);
yield return null;
}
efeito.SetActive (false);
bater = true;
foreach (GameObject back in backgrounds) {
back.GetComponent<Move> ().speed = 3.0f;
}
foreach (GameObject obs in obstaculos) {
obs.GetComponent<Move> ().speed = 3.0f;
}
foreach (GameObject ac in allcoins) {
ac.GetComponent<Move> ().speed = 3.0f;
}
foreach (GameObject vd in allvidas) {
vd.GetComponent<Move> ().speed = 3.0f;
}
foreach (GameObject pu in powerups) {
pu.GetComponent<Move> ().speed = 3.0f;
}
}}
And this is the code from the second script in the second scene, where i want to change the sprite
public class MainMenu : MonoBehaviour
{
public GameObject menustore;
public Sprite skinteste;
public void PlayGame ()
{
SceneManager.LoadScene (1);
Time.timeScale = 1f;
}
public void Home1(){
SceneManager.LoadScene (0);
}
public void openstore ()
{
menustore.SetActive (true);
}
public void skin1 ()
{
//DontDestroyOnLoad (GameObject.FindWithTag("iman"));
GameObject.FindWithTag("iman").GetComponent<SpriteRenderer>().sprite
= skinteste;
}}
You have to use DontDestroyOnLoad()
method which Unity3d provide for you. With this method you can create gameObjects which don't get destroyed when you switch from scene to scene.
public class YourClass : MonoBehaviour {
public static YourClass singleton = null;
void Awake()
{
DontDestroyOnLoad(this.gameObject);
if(singleton == null)
{
singleton = this;
}
}}
Also take a look at singleton design pattern it is used very often. :)