我如何在Unity的另一个场景中访问游戏对象
How can i access game object in another scene in Unity
我是 Unity 的初学者,所以...
我想更改另一个场景中的 Gameobject 的精灵,这不是我正在使用的场景
这是第一个场景的代码,我想获取带有标签 "iman" 的游戏对象,到第二个场景
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;
}}
你必须使用Unity3d为你提供的DontDestroyOnLoad()
方法。使用此方法,您可以创建游戏对象,当您从一个场景切换到另一个场景时,这些游戏对象不会被破坏。
public class YourClass : MonoBehaviour {
public static YourClass singleton = null;
void Awake()
{
DontDestroyOnLoad(this.gameObject);
if(singleton == null)
{
singleton = this;
}
}}
也看看经常使用的单例设计模式。 :)
我是 Unity 的初学者,所以...
我想更改另一个场景中的 Gameobject 的精灵,这不是我正在使用的场景
这是第一个场景的代码,我想获取带有标签 "iman" 的游戏对象,到第二个场景
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;
}}
你必须使用Unity3d为你提供的DontDestroyOnLoad()
方法。使用此方法,您可以创建游戏对象,当您从一个场景切换到另一个场景时,这些游戏对象不会被破坏。
public class YourClass : MonoBehaviour {
public static YourClass singleton = null;
void Awake()
{
DontDestroyOnLoad(this.gameObject);
if(singleton == null)
{
singleton = this;
}
}}
也看看经常使用的单例设计模式。 :)