我一直在用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/