如何在Unity中的另一个场景中访问游戏对象

时间:2018-06-21 00:35:46

标签: c# unity3d scene gameobject

我是Unity的初学者,所以...

我想更改另一个场景中的游戏对象的精灵,而不是我正在使用的那个场景

这是从第一个场景到第二个场景的代码,我想要将带有“ iman”标签的Gameobject移到第二个场景

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;
    }
}}

这是第二个场景中第二个脚本的代码,我想在其中更改精灵

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;
}}

1 个答案:

答案 0 :(得分:2)

您必须使用Unity3d为您提供的DontDestroyOnLoad()方法。使用此方法,您可以创建在场景之间切换时不会被破坏的gameObjects。

public class YourClass : MonoBehaviour {

public static YourClass singleton = null;

void Awake()
{
     DontDestroyOnLoad(this.gameObject);
     if(singleton == null)
     {
         singleton = this;
     } 
}}

还可以看看它经常使用的单例设计模式。 :)