Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice
  3. Join us on November 16th, 2023, between 1 pm and 9 pm CET for Ask the Experts Online on Discord and on Unity Discussions.
    Dismiss Notice

[SOLVED]How to assign RectTransform within a script and not in the engine?

Discussion in '2D' started by Bolchev, Aug 7, 2015.

  1. Bolchev

    Bolchev

    Joined:
    Aug 3, 2015
    Posts:
    17
    Hello I'm developing a 2d space shooter game initially starting with quill18creates tutorial scripts but eventually going off the rails complete to make the game my own. I have animations, game menus health bars droppable hp and all kinda other cool systems I didn't think I could make. Of course a lot of help I received from the Unity community and youtube tutorials so a big thank you to these guys that make the time to make these video tutorials and explain things in a very understandable way.

    Now however I've encountered another problem. I'm found a tutorial on how to create a health bar and implemented in into my script, and it works I add it to the game object I assign a RectTransform in the editor and the slider moves properly. However as soon as I save the game object with a prefab with the script and assigned RectTransform. The defined RectTransform automatically goes back to none. And I cannot assign anything to it.

    This is a problem because in my game the player has 3 lives. Which means a spawn script and a prefab with and assigned RectTransform to it. So since Unity allows me to assign the RectTransform only while the object exist on the scene, but not to save it in a prefab is there a way to define it directly in my scripts?

    Here is my script:


    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;

    public class BetterHpScript : MonoBehaviour {

    public int health = 100;
    public int maxhealth = 100;
    public float invulnPeriod = 0;
    float invulnTimer = 0;
    int correctLayer;
    public RectTransform healthTransform;
    public float cachedY;
    public float minXvalue;
    public float maxXvalue;




    SpriteRenderer spriteRend;

    void Start() {

    cachedY = healthTransform.position.y;
    maxXvalue = healthTransform.position.x;
    minXvalue = healthTransform.position.x - healthTransform.rect.width;
    correctLayer = gameObject.layer;

    // NOTE! This only get the renderer on the parent object.
    // In other words, it doesn't work for children. I.E. "enemy01"
    spriteRend = GetComponent<SpriteRenderer>();

    if(spriteRend == null) {
    spriteRend = transform.GetComponentInChildren<SpriteRenderer>();

    if(spriteRend==null) {
    Debug.LogError("Object '"+gameObject.name+"' has no sprite renderer.");
    }
    }
    }

    void OnTriggerEnter2D(Collider2D col) {
    if (col.gameObject.tag == "Enemy") {
    health --;
    }
    if (col.gameObject.tag == "Health") {
    health ++;
    }
    HandleHealth ();

    if(invulnPeriod > 0) {
    invulnTimer = invulnPeriod;
    gameObject.layer = 10;
    }
    }

    void Update() {

    if (health >= maxhealth) {
    health = maxhealth;
    }
    if(invulnTimer > 0) {
    invulnTimer -= Time.deltaTime;

    if(invulnTimer <= 0) {
    gameObject.layer = correctLayer;
    if(spriteRend != null) {
    spriteRend.enabled = true;
    }
    }
    else {
    if(spriteRend != null) {
    spriteRend.enabled = !spriteRend.enabled;
    }
    }
    }

    if(health <= 0) {
    Die();
    }
    }

    void Die() {

    Destroy(gameObject);
    }
    private float MapValue (float x, float inMin, float inMax, float outMin, float outMax)
    {
    return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;

    }
    private void HandleHealth ()
    {
    float currentXvalue = MapValue (health, 0, maxhealth, minXvalue, maxXvalue);
    healthTransform.position = new Vector3 (currentXvalue, cachedY);
    }
    }
     
  2. Bolchev

    Bolchev

    Joined:
    Aug 3, 2015
    Posts:
    17
    My problem was solved by a youtube streamer I'm posting it the code with the solution in case anyone needs it:
    healthTransfomr = GameObject.Find("The name of the green part of your healthbar").GetComponent<RectTransform>();