这是项目的延续,您可以在这里找到第一篇文章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); } }
最终,这也使僵尸攻击墙成为了!!!

您可以在这里尝试游戏。
游戏开始!
>马可