Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • 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 /
  • Help Room /
avatar image
0
Question by HeartOfGermany · Feb 24, 2020 at 11:09 AM · variablehealth

Adding variable to object

I have the following situation:

I use Unity Playground to create some sort of Asteroids for practicing my unity skills, which realy suck a lot.

I followed the "How to Start Making Games - Unity Playground (Beginner Friendly)" instructions so far and replicated the identical concept. There is a script called "DestroyForPointsAttribute.cs"

I edited it like follows. (more on that below) using UnityEngine; using System.Collections;

 [AddComponentMenu("Playground/Attributes/Destroy For Points")]
 public class DestroyForPointsAttribute : MonoBehaviour
 {
     public int pointsWorth = 5;
     private UIScript userInterface;
   private int this.gameObject.healthPoints = 15;
     private void Start()
     {
         // Find the UI in the scene and store a reference for later use
         userInterface = GameObject.FindObjectOfType<UIScript>();
     }
     
 
     //This will create a dialog window asking for which dialog to add
     private void Reset()
     {
         Utils.Collider2DDialogWindow(this.gameObject, false);
     }
     
     //duplication of the following function to accomodate both trigger and non-trigger Colliders
     private void OnCollisionEnter2D(Collision2D collisionData)
     {
         OnTriggerEnter2D(collisionData.collider);
     }
 
     // This function gets called everytime this object collides with another trigger
     private void OnTriggerEnter2D(Collider2D collisionData)
     {
         // is the other object a Bullet?
         if(collisionData.gameObject.CompareTag("Bullet"))
         {
 
        if(this.gameObject.healthPoints == null)
        {
         this.gameObject.healthPoints = 15;
        }
        this.gameObject.healthPoints -= 5;
        if (this.gameObject.healthPoints < 1)
        {
              if(userInterface != null)
              {
                   // add one point
                   BulletAttribute b = collisionData.gameObject.GetComponent<BulletAttribute>();
                   if(b != null)
                   {
                      userInterface.AddPoints(b.playerId, pointsWorth);
                   }
                   else
                   {
                      Debug.Log("Use a BulletAttribute on one of the objects involved in the collision if you want one of the players to receive points for destroying the target.");
                   }
              }
              else
              {
                   Debug.Log("There is no UI in the scene, hence points can't be displayed.");
              }
 
              // then destroy this object
              Destroy(gameObject);
           }
      }
     }
 }



I tried: private int this.gameObject.healthPoints = 15; private int gameObject.healthPoints = 15; public >the rest = the same<

As you already can see, I cannot wrap arount my head around the structure of this stuff. C# is killing me. This script is directly linked to the asteroid.

Usually the script will just destroy asteroid and the bullet stays and it gives the player 1 point or what ever was configured.

I want the object to have health, but somehow I cannot set the variable to the object (asteroid).

I do not realy get it. Why can I not just use those variables?

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 JPhilipp · Mar 08, 2020 at 03:39 PM 0
Share

@HeartOfGermany Note you can just write healthPoints ins$$anonymous$$d of this.gameObject.healthPoints. Now what specifically goes wrong? Try to limit your code to the smallest possible issue-reproducing example, and edit your question to quote just that, it might help us understand your issue.

1 Reply

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

Answer by streeetwalker · Mar 08, 2020 at 04:29 PM

Hey I just saw this. Sorry for that no one has replied sooner.

I want to understand your problem, so where is the issue: You are trying to set the health point on the gameobject this script is attached to?

If that is the case, I'm not sure why you are using:

   private int  this.gameObject.healthPoints = 15;

Instead, it should be:

   private int healthPoints = 15;

   // likewise elsewhere in the script, 
   // you just reference healthPoints

   if ( healthPoints < 1)


You do not need the 'this.gameObject' because you want to set the health points in the script, not on the game object the script is a component of. The game object "owns" the script when you attach it. You should not want/need/ or even try to add a property to the gameobject itself.

Comment
Add comment · Show 3 · 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
avatar image HeartOfGermany · Mar 09, 2020 at 03:28 PM 0
Share

That explaination really helped a lot, thank you!

So far understood. What, if I want to call the health variable from another script?

With gsc I could for example create an array like:

level.asteroid[1] ... level.asteroid[9999]

So I could use something like:

level.asteroid[123].health and done! I know, GSC is a really simple scripting language. But I do not fully grasp, how to archive something like that. You know what, I will test around some the next time. :)

avatar image streeetwalker HeartOfGermany · Mar 09, 2020 at 07:56 PM 0
Share

@HeartOfGermany

> level.asteroid[123].health

That will only work if those are script objects on your game objects.

Often we store gameobject references in an array.
To get at at health in the script attached to a game object then, you could do:

  // replace ScriptName with the script component class name
  level.asteroid[123].GetComponent<ScriptName>().health



but that is costly in terms of processor time if you have to do it a lot. There are several approaches to make it easier. One way create an array of scripts ins$$anonymous$$d of game objects, and use the script to get at the game object.

Of course you have to declare the array or list data type as ScritpClassName[] -- what ever the class name is. So, Asteroid[] if the name of the class is 'Asteroid'
Say, you instance a prefab that already has the script on it - you should be doing that. Assu$$anonymous$$g the script class is 'Asteroid' in pseudo code:

       // in your prefab creation loop using index i
       GameObject g = (GameObject) Instantiate ( ..... );
       level.asteroid[i]  = g.GetComponent<Asteroid>();
 
       // now you can state
       level.asteroid[i].gameObject.transform.position
       level.asteroid[i].health 



Another way to do it is to create a list of objects: Create a class that contains a game object and it's script as variables, in a separate script file:

   public class AsteroidObj {  
            public Gameobject go; 
            public Asteroid sc; 

            //  this is the object constructor:
            public AsteroidObj( GameObject _go, Asteroid _sc ){
                   this.go = _go;
                   this.as = _sc;
            }
    } // do not attach this AsteroidObj.cs script to any game object!

  // then in any other script file:
   private AsteroidObj[] asteroidList = new AsteroidObj[200];
   // really better to use a list than an array, but just for example
   
   // then in your asteroid creation loop
   GameObject g = (GameObject) Instantiate ( ..... );
   Asteroid sc = g.GetComponent<Asteroid>();
   asteroidList[i]  = new AsteroidObj( g, sc );

   // then to access the member fields of the object:
   asteroidList[i].sc.health = 100f;
   asteroidList[i].go.transform.position.y = 5f;



There are many ways to approach it.

avatar image streeetwalker streeetwalker · Mar 10, 2020 at 03:42 AM 0
Share

@HeartOfGermany, here is a more comprehensive example

 public class AsteroidObj { 
             // sometimes handy to keep references to
             // the gameObject name and it's list index
             public string id;  // my gameObject name 
             public Transform tr; // of my gameObject
             public Asteroid sc;  // script of my gameObject;
             public int index; // my position in a list
             // the object constructor:
             public AsteroidObj( string _id, Transform _tr, Asteroid _sc, int _idx  ){
                    this.id = _id;
                    this.tr = _tr;
                    this.as = _sc;
                    this.index = _idx;
             }
     } // do not attach this AsteroidObj.cs script to any game object!
 
   // then in any other script file:
    private List<AsteroidObj> asteroidList = new List<AsteroidObj>;
    // really better to use a list than an array
    
    // then in your asteroid creation loop
    GameObject g = (GameObject) Instantiate ( ..... );
    g.name = "asteroid_" + i; // unique name for each gameOject
    Asteroid sc = g.GetComponent<Asteroid>();
    AsteroidObj  ao = new AsteroidObj( g.name, g.transform, sc, i ) ;
    
    // good idea to keep a reference to the object in the  script
    // for example, collisions
    // so in Asteroid class you declare public AsteroidObj  astObj;
    sc.astObj = ao;
    asteroidList.Insert( i,  ao );
 
    // then to access the member fields of the object:
    asteroidList[i].sc.health = 100f;
    asteroidList[i].tr.position.y = 5f;
 
   // and in a collision in any script
   void OnCollisonEnter( Collision collision ){ 
          GameObject g = collision.gameObject;
          Asteroid as = g.GetComponent<Asteroid>();
          AsteroidObj asObj = as.astObj;
          Debug.log( "collided: " + asObj.id + ", list index: " + asObj.index);
          Destroy( g );
          // assumes this script has a reference to the asteroidList
          asteroidList.RemoveAt( asObj.index );
          Destroy( asObj ); // destroy the AsteroidObj object 
   }
             

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.

Follow this Question

Answers Answers and Comments

206 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 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 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 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 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 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 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 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 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 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 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 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 avatar image avatar image

Related Questions

How to make GUI variables compatible with the UI system? 0 Answers

How to sum up values from clones 1 Answer

Health variable not changing 1 Answer

My health bars image.fillAmount doesnt change. 4 Answers

Health pickup script issue -1 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