我一直在用C#在Unity中进行RPG游戏,并且在执行任务系统时,特别是在杀死特定数量的敌人的系统中,我发现了在场景中存在3个敌人并成为任务目标的问题:杀死3个敌人。如果我在激活任务之前杀死了他们,后来又激活了任务,则该任务不会给我奖励(在这种情况下为体验)。我如何告诉敌人,并确保如果任务发现我已经杀死了要完成任务的必要敌人,则可以同等地给予我奖励?



我认为这里需要两个脚本:

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

public class QuestObject : MonoBehaviour {

    public int questNumber;

    public QuestManager qManager;

    public string startText;
    public string endText;

    public bool isItemQuest;
    public string targetItem;

    public bool isEnemyQuest;
    public string targetEnemy;
    public int enemiesToKill;
    private int enemyKillCount;

    private PlayerStats playerStats;
    public int EXPToGive;

    void Start () {
        playerStats = FindObjectOfType <PlayerStats> ();
    }

    void Update () {

        if (isItemQuest) {

            if (qManager.itemCollected == targetItem) {

                qManager.itemCollected = null;
                EndQuest ();
            }
        }


        if (isEnemyQuest) {

            if (qManager.enemyKilled == targetEnemy) {

                qManager.enemyKilled = null;

                enemyKillCount++;

            }

            if (enemyKillCount >= enemiesToKill) {

                EndQuest ();

            }
        }
    }

    public void StartQuest (){
        qManager.ShowQuestText (startText);



    }

    public void EndQuest (){
        qManager.ShowQuestText (endText);
        playerStats.AddEXP (EXPToGive);
        qManager.questCompleted [questNumber] = true;
        gameObject.SetActive (false);


    }
}




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

public class EnemyHealth : MonoBehaviour {

    public int startingHealth;
    public int currentHealth;
    public GameObject damageBurst;
    private PlayerStats playerStats;
    public int EXPToGive;

    public string enemyQuestName;
    private QuestManager qManager;




    void Start ()
    {
        // Setting up the references.
        //anim = GetComponent <Animator> ();
        //enemyAudio = GetComponent <AudioSource> ();
        //enemyMovement = GetComponent <EnemyMovement> ();
        //enemyAttacking = GetComponentInChildren <EnemyAttack> ();
        // Set the initial health of the player.
        currentHealth = startingHealth;
        playerStats = FindObjectOfType <PlayerStats> ();
        qManager = FindObjectOfType <QuestManager> ();
    }



    void Update ()
    {
        if (currentHealth <= 0) {

            qManager.enemyKilled = enemyQuestName;

            Destroy (gameObject);
            playerStats.AddEXP (EXPToGive);
        }
    }


    public void TakeDamage (int amountDamage)
    {
        // Reduce the current health by the damage amount.
        currentHealth -= amountDamage;
        Instantiate (damageBurst, transform.position, transform.rotation);


    }

    public void SetMaxHelth () {
        currentHealth = startingHealth;
    }


}

最佳答案

一种解决方法是创建某种类型的“ WorldManager”,其中包括被杀死的每个敌人。当开始一个任务时,该任务可以检查WorldManagers的击杀数并将其添加到它自己的数中。

   public void StartQuest (){
        qManager.ShowQuestText (startText);
        this.enemyKillCount += worldManager.GetKillCount();
    }


在您的敌人职业中,您必须向您的worldManager添加一个杀死对象。

 void Update ()
    {
        if (currentHealth <= 0) {

            qManager.enemyKilled = enemyQuestName;
            this.worldManager.AddKill(this)
            Destroy (gameObject);
            playerStats.AddEXP (EXPToGive);
        }
    }


选择:

让您的QManager注意场景中的每一次杀戮。
您可以通过多种方式实现这一目标。
其中之一是将您的Qemager的引用传递给您的EnemyObject,并与上面提供的“ WorldManager”进行相同的操作,或者您可以使用Messaging并在敌人被杀死时向QManager发出一条消息。

选择2:
杀死敌人后抛出事件,并在您的QManager / WorldManager上订阅该事件。这样,您可以在每个游戏中重用敌人的职业。从我的角度来看,静态依赖是有害的,但是在互联网上到处都有很多讨论和讨论。

关于c# - 如何提高对场景中“杀死”事件的认识,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45927483/

10-13 06:49