我正在使用以下机制在团结中打败这场比赛:当玩家的对手击中敌人的时候:
public GameObject obj;
...
void OnTriggerEnter(Collider collider){
obj=collider.gameObject;
}
然后,当玩家攻击时,如果它与物体的距离足够小,则敌人会受到伤害:
void hit(){
if(kicked&&close){ //if he is kicking and is close enough
obj.GetComponent<health>().DealDamage(damage); //this is inside a try/catch, just in case obj=null
(...)
}
问题是,如果2个敌人触碰到玩家,只有最后一个会被分配给变量obj,所以他会单独进行击中,这是我不想发生的。
有什么建议吗?我应该替换
GameObject obj;
有一个数组?那怎么样?
然后,在OnTriggerEnter方法上,将对象添加到数组中? (怎么做?)
答案 0 :(得分:1)
一种简单的方法是让你的玩家拿着一个触发盒。当敌人进入触发器框时,它们会被添加到集合中并在退出时被删除:
public class PlayerAttack:MonoBehaviour
{
private HashSet<Enemy> list = null;
private void Awake(){ this.list = new HashSet<Enemy>(); }
private void OnTriggerEnter(Collider col)
{
Enemy enemy = col.transform.GetComponent<Enemy>();
if(enemy != null)
{
this.list.Add(enemy);
}
}
private void OnTriggerExit(Collider col)
{
Enemy enemy = col.transform.GetComponent<Enemy>();
if(enemy != null && this.list.Contains(enemy) == true)
{
this.list.Remove(enemy);
}
}
public void OnAttack()
{
foreach(Enemy enemy in this.list)
{
enemy.GetComponent<Health>.DealDamage(damage);
}
}
}
OnAttack是你的攻击方法,它会遍历所有近距离的敌人。 HashSet在这里是一个很好的候选者,因为它不会添加两次相同的项目,因此没有看到敌人获得多次点击的风险。
答案 1 :(得分:0)
我无法解决问题。永远不会分配伤害。
private HashSet<Enemy> list = null;
private void Awake(){this.list = new HashSet<Enemy>();}
void OnTriggerEnter(Collider col){
Enemy enemy = col.transform.GetComponent<Enemy>();
print(enemy); // this occurs
if(enemy != null && this.list.Contains(enemy) == true)
{
print(enemy); // this never occurs
this.list.Remove(enemy);
}
}
}
void hit(){
print("hit"); // this occurs
foreach(Enemy enemy in this.list)
{ // this never occurs
enemy.GetComponent<health>().DealDamage(damage);
}
@Everts
答案 2 :(得分:-2)
屏幕上的所有对象列表都是敌人,树木,盒子等。
在无休止的循环中,您可以对所有对象执行一些操作:
while(true)
{
// Here non combat characters do something.
foreach(NonCombatCharacter character in NonCombatCharacters)
{
switch(character.Type)
{
case tinyBird: character.DoAction(Actions.Fly); break;
case ...
default:break;
}
}
// Here your combat character aka enemies
foreach(CombatCharacter character in CombatCharacters)
{
// Here you do your combat logic, cheks and etc.
}
// And then you player character change the world model, here you
// process all player action such as changing position, losing hp.
// And then world keep lifecycle again
}
编辑:所以有一个全局数组foreach对象。在团结中你也得到了它们,即使你没有创建阵列
你走了:
https://docs.unity3d.com/ScriptReference/Object.FindObjectsOfType.html
使用文档,大多数常见答案都在那里。