Soy nuevo en la codificación y no estoy muy seguro de cómo agregar contexto de 1 script a otro. Para mi juego hasta ahora, he obtenido código de Frankensteining de múltiples fuentes y me he metido en un callejón sin salida. Quiero que mi jugador reciba la misma cantidad de daño que el indicado por EnemyDamage en el guión 'Enemy'. No estoy muy seguro de qué otro contexto darte, pero si sabes cómo puedes ayudarme, ¡sería genial!

Guión enemigo

using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    public int health = 100;
    public int enemyDamage = 10;
    public GameObject deathEffect;

    public void TakeDamage (int damage)
    {
        health -= damage;

        if (health <= 0)
        {
            Die();
        }
    }
   void Die ()
    {
        Instantiate(deathEffect, transform.position, Quaternion.identity);
        Destroy(gameObject);
    }
    
}

Secuencia de comandos PlayerHealth

    using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;

public class PlayerHealth : MonoBehaviour
{
    public int maxHealth = 10;
    public int currentHealth;
    public int damage = 1;
    public HealthBar healthBar;
    // Start is called before the first frame update
    void Start()
    {
        currentHealth = maxHealth;
        healthBar.SetMaxHealth(maxHealth);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.R))
        {
            TakenDamage(1);
        }

        if (currentHealth <= 0)
        {
            PlayerDeath();
        }
    }
    public void TakenDamage(int damage)
    {
        currentHealth -= damage;

        healthBar.SetHealth(currentHealth);
    }
    void PlayerDeath()
    {
        UnityEngine.Debug.Log("bean guy");
    }
    public void OnTriggerEnter2D(Collider2D hitInfo)
    {
        UnityEngine.Debug.Log("We did it boys");
        PlayerHealth player = hitInfo.GetComponent<PlayerHealth>();
        { 
            UnityEngine.Debug.Log("beans");
            TakenDamage(enemyDamage); // I need this to update with enemyDamage 's value
        }



    }
}
1
HarrisonO 18 jul. 2020 a las 15:04

1 respuesta

La mejor respuesta

Hay múltiples formas:

Haga de EnemyDamage una variable estática

public static int enemyDamage = 10;

Entonces puedes llamarlo en otras secuencias de comandos con Enemy.enemyDamage

Tenga en cuenta que no puede establecer variables estáticas en el Inspector.

Utilice GetComponent

Enemy enemy = gameObject.GetComponent(typeof(Enemy )) as Enemy;

enemy.enemyDamage 

Crea un GameManager

GameManager.CS:

#region Singelton
    public static GameManager instance;

    void Awake()
    {
        if (instance != null)
        {
            Debug.LogWarning("More than one Instance of Inventory found");
            return;
        }

        instance = this;
    }
#endregion
    
public int enemyDamage = 10;    

Haciendo referencia a la secuencia de comandos de GameManager:

GameManager gm;

void Start()
    {
        gm = GameManager.instance;
    }

//Calling Function in GameManager
gm.EndGame();
// Getting Value from GameManager
gm.enemyDamage();

¿Cuándo usar qué?

  • Si desea una solución a más corto plazo, usaría una variable estática, no recomendada con varios enemigos (los diferentes valores de daño del enemigo ahora son inmovibles)
  • Si tiene más variables o incluso funciones a las que se debe poder acceder desde varios scripts, le aconsejaría que use un Administrador de juegos en su lugar
  • Necesita obtener una referencia del enemigo para usar GetComponent, pero hace posible agregar varios valores enemigos diferentes.
-1
MathewHD 18 jul. 2020 a las 18:34