教程—流氓游戏—重构GameObjects参与度

这是项目的延续,您可以在这里找到第一篇文章Tutorial-Rogue Survival。

您可以在这里尝试游戏

在这篇文章中,我将讨论如何理解如何管理GetComponent()和通用组件以成功地通过不同的脚本传递引用的组件。


在过去的两周中,我一直在思考一些方法,以使Rogue Survival Zombie游戏中的演员与多个对象互动。

本教程提供了使Player与Wall接触(攻击并摧毁它们)以及让Zombies攻击Player并降低其生命值的代码。

管理碰撞控制的脚本由AttemptMove 完成,该脚本在僵尸或玩家必须移动时从其调用。 “ ”表示脚本期望传递特定的组件名称,以便它可以执行更特定的操作。 “组件”基本上是GameObject的一部分(即屏幕上的敌人和玩家化身)。 某些组件用于敌人游戏对象的精灵渲染器,用于控制其行为的脚本,用于记录其在x,y,z空间中位置的转换。

  受保护的虚拟虚空AttemptMove (int xDir,int yDir)其中T:组件; {RaycastHit2D hit; bool canMove = Move(xDir,yDir,out hit);  if( WheelHit.transform == null)return; T hitComponent = WheelHit.transform.GetComponent (); if(!canMove && hitComponent!= null)OnCantMove(hitComponent);} 

一个示例是Eneny脚本调用AttemptMove ,这是因为该敌人应该移动检查是否与矿石碰撞,并按定义的传递“玩家”。

这意味着碰撞脚本正在检测敌人正在碰撞的对象,并尝试使用以下方法从中提取“ Playet”组件

T hitComponent = WheelHit.transform.GetComponent ();

这就是让我一阵子受阻的原因:请注意,它不是将“ Player”作为游戏对象,而是将“ Player”作为附加的组件脚本! 因此,这意味着如果敌人正在与除播放器之外的所有对象碰撞,则hitComponent返回null,因为它是唯一具有名为“播放器”(脚本名称)的组件的对象。

这样,使一个对象与一种以上类型的对象进行交互是不可行的,因为这样做可能需要多次调用MovingObject从而多次移动该对象。

因此,我在MoveObject 中更改了脚本,以传递与可移动对象(命中)相撞的整个对象,并对敌人脚本进行必要的决定。

 受保护的虚拟虚空AttemptMove (int xDir,int yDir) 
  其中T:分量 
  {
   RaycastHit2D命中;
   bool canMove = Move(xDir,yDir,out hit); if(hit.transform == null)
    return; if(!canMove && hit.transform.name.Contains(“ Player”)|| hit.transform.name.Contains(“ Wall”)&&!hit.transform.name.Contains(“ OuterWall”)))
     OnCantMove(hit);
  
  } 

并执行一些if()检查敌人脚本,例如:

 受保护的覆盖无效OnCantMove(命中RaycastHit2D)
  {if(hit.transform.name.Contains(“ Player”)){
   播放器hitPlayer = hit.transform.GetComponent (); animator.SetTrigger(“ enemyAttack”);
    hitPlayer.LoseFood(playerDamage); SoundManager.instance.RandomizeSfx(enemyAttack1,敌人Attack2);
   } if(hit.transform.name.Contains(“ Wall”)){
   墙hitWall = hit.transform.GetComponent ();  //传递被击中的东西
    hitWall.DamageWall(wallDamage); animator.SetTrigger(“ enemyAttack”); SoundManager.instance.RandomizeSfx(enemyAttack1,敌人Attack2);
   }
  } 

最终,这也使僵尸攻击墙成为了!!!

您可以在这里尝试游戏。

游戏开始!
>马可