Jestem nowy, aby kodować i nie jestem pewien, jak dodać kontekst z 1 skryptu do drugiego. Do tej pory w mojej grze byłam kodeksowaniem kodu Frankensteining z wielu źródeł i mają głowę do martwego końca. Chcę, żeby mój gracz przyjąć tę samą ilość obrażeń, jak określono przez EnmyDamage w skrypcie "wroga". Nie jestem pewien, jaki inny kontekst, ale jeśli wiesz, jak mógłbyś mi pomóc, to byłoby niesamowite!

skrypt wroga

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);
    }
    
}

Skrypt 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 lipiec 2020, 15:04

1 odpowiedź

Najlepsza odpowiedź

Istnieje wiele sposobów:

uczynić włącznikową zmienną statyczną

public static int enemyDamage = 10;

Wtedy możesz zadzwonić do innych skryptów za pomocą Enemy.enemyDamage

Bądź świadomy, że nie możesz ustawić zmiennych statycznych w inspektora.

Użyj getComponent

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

enemy.enemyDamage 

Utwórz 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;    

Odwołanie do skryptu GameManager:

GameManager gm;

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

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

Kiedy używać co?

  • Jeśli chcesz bardziej krótkoterminowy rozwiązanie, użyję zmiennej statycznej, nie zalecanej wieloma wrogami (różne wartości EnmyDamage są teraz niezmienne)
  • Jeśli masz więcej zmiennych, a nawet funkcji, które muszą być dostępne z wielu skryptów, radzę zamiast tego używać menedżera gry
  • Musisz uzyskać odniesienie do wroga, aby użyć GetComponent, ale umożliwia dodanie wielu różnych wartości EnmyDamage
-1
MathewHD 18 lipiec 2020, 18:34