• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Mobile D · Aug 19, 2013 at 01:39 AM · accessing from any script

Trouble Accessing Script Variables of Cloned Objects

I'm having difficulty properly running methods or accessing public variables of scripts attached to cloned gameobjects. For example, the code below will create three GridPiece objects, and successfully move the third object back by 1 unit. However, the 2nd GridPiece does not see any change to its Passable variable.

My GridPieceScript class:

 using UnityEngine;
 using System.Collections;
 
 public class GridPieceScript : MonoBehaviour {
     
     public bool Passable;
     
     void Start () 
     {
         Passable = false;
     }
     
     void Update () 
     {
 
     }
     
     public void MakePassable()
     {
         Passable = true;
     }
 
 }

And my GridControlScript class:

 using UnityEngine;
 using System.Collections;
 
 public class GridControlScript : MonoBehaviour {
     
     public GameObject GridPiece;
 
     void Start () 
     {
         
         GameObject First = (GameObject)Instantiate (GridPiece, new Vector3(0, 0, 0), Quaternion.identity);
         GameObject Second = (GameObject)Instantiate (GridPiece, new Vector3(1, 0, 0), Quaternion.identity);
         GameObject Third = (GameObject)Instantiate (GridPiece, new Vector3(2, 0, 0), Quaternion.identity);
 
         Second.GetComponent<GridPieceScript>().Passable = true;
         Second.GetComponent<GridPieceScript>().MakePassable();
         Third.GetComponent<Transform>().Translate(new Vector3(0f, 0f, 1f));
 
     }
     
     void Update () 
     {
     
     }
 }
Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image DaveA · Aug 19, 2013 at 02:14 AM 0
Share

Are you familiar with the debugger?

1 Reply

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by Benproductions1 · Aug 19, 2013 at 02:30 AM

Hello,

If we take a look at the order of events that happen:

Frame 1: (The first frame)
1. GridControlScript.Start() is called
2. 3 objects are instantiated
3. Awake() is called on the 3 objects
4. Passable is set to true on first and second object
5. Update() is called on GridControlScript

As you can see, Start is not called on the 3 objects yet.

Frame 2: (The second frame)
1. Start() is called on 3 objects, setting Passable to false
2. Update() is called on all objects (in no specific order)

Looking at that, it is obvious why Passable is never set to true. Because Start which sets it to false, is called in the frame after the object has been instantiated.
If you want something to happen after Instantiate, but before anything else, you need to use Awake and not Start.

However, if you want default values for variables, you can simply go:

 public bool Passable = false;

However public variables are serialized with Prefabs, so doing this only defaults it for a new script, not a prefab.
To avoid this you can set the variable to be NonSerialized like so:

 [NonSerialized]
 public bool Passable = false;

As @DaveA said, you should Debug your script. Put Debug.Log calls in important places and see when they happen. You could have answered this yourself by doing exactly that :)

Hope this helps,
Benproductions1

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

17 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Trouble with calling a variable from another script 5 Answers

GameObject.name to call script name? 1 Answer

Global data structure accessible by any script? 1 Answer

Is it possible to acces variables from the unity prefabs such as the sparks and smoke 0 Answers

accesing variable from other script 4 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges