Unity3d - 当场景中有多个 Collier 时,Raycast 不计算命中

Posted

技术标签:

【中文标题】Unity3d - 当场景中有多个 Collier 时,Raycast 不计算命中【英文标题】:Unity3d - Raycast doesnt Count Hit when multiple Colliers are in the scene 【发布时间】:2021-03-26 10:41:01 【问题描述】:
private bool InteractCombat() 
  GameObject target;
  RaycastHit[] hits = Physics.RaycastAll(GetMouseRay());
  foreach(RaycastHit hit in hits) 
    if (hit.transform.gameObject.tag == "gameEnemy") 
      target = hit.transform.gameObject;
     else 
      return false;
    
    if (target == null) return false;
    if (target != null) 
      targetToAttack = target;
      targetState = targetToAttack.GetComponent < GameObjectState > ();
    ;
    if (!targetState.IsDead || targetState.CanBeDestroyed) 
      GetComponent < CursorChanger > ().setCursorToAttack();
      enableHealthBarAndAdjustSize();
      if (Input.GetMouseButtonDown(0)) 
        GetComponent < Animator > ().ResetTrigger("stopattack");
        GetComponent < Attacker > ().Attack(targetToAttack);
      
     else 
      disableEnemyInfo();
      GetComponent < CursorChanger > ().setCursorToWalk();
    
    return true;
  
  return false;

这基本上是我的 PlayerController 脚本中的代码。

场景中有一个敌​​人,一个碰撞器,一切正常。

当我添加 Enemy Prefab 的第二个克隆时,此处的 Raycast 方法无法找到 GameObject - 当我移除其中一个 Clone 的 Capsule Collider 时,杀死仍然拥有 Collider 的 Remaining Enemy 一切都很好。

我在这里缺少什么?为什么我不能在场景中有多个碰撞器(即使在不同的对象上)而不破坏我的整个攻击功能??。

【问题讨论】:

用适当的缩进粘贴代码 我不能按我的意愿工作:/ 网上有代码美化器,我只用过一个 好吧,你总是在 return 的第一个项目上 hits,所以只有第一个命中是相关的。 您返回true 为点击中未标记gameEnemy 的每个项目.. 请注意顺便说一句,您应该使用CompareTag 而不是直接== .. 还有一些像if(target == null)if(target != null)这样的冗余检查,一般来说,你应该只检查if(target)UnityEngine.Object类型.. 【参考方案1】:
foreach(RaycastHit hit in hits) 
if (hit.transform.gameObject.tag == "gameEnemy") 
  target = hit.transform.gameObject;
 else 
  return false; //Had to be changed to Continue, to not return the function, to try 
                  next element

if (target == null) return false;
if (target != null) 
  targetToAttack = target;
  targetState = targetToAttack.GetComponent < GameObjectState > ();
;
if (!targetState.IsDead || targetState.CanBeDestroyed) 
  GetComponent < CursorChanger > ().setCursorToAttack();
  enableHealthBarAndAdjustSize();
  if (Input.GetMouseButtonDown(0)) 
    GetComponent < Animator > ().ResetTrigger("stopattack");
    GetComponent < Attacker > ().Attack(targetToAttack);
  

问题是我把“return false”误认为 “继续”。这种方式只检查了第一个元素,这种方式总是地形。 愚蠢的错误,但由于@Ruzhim 和@derHugo 的回答,我花了很长时间才弄明白

【讨论】:

以上是关于Unity3d - 当场景中有多个 Collier 时,Raycast 不计算命中的主要内容,如果未能解决你的问题,请参考以下文章

unity3d 如何进行场景切换?

unity3D 如何导入3d场景

如何在unity3d中为每个场景设置方向

Unity3D相机

unity3d模型怎么查看

unity3D如何让场景的某个地方变暗