【问题标题】:Avoid raycast hitting player without layermask避免光线投射击中没有图层蒙版的播放器
【发布时间】:2021-03-18 04:30:53
【问题描述】:

我正在制作一款 FPS 游戏,玩家可以在瞄准时射击自己。如果我添加一个图层蒙版,它是固定的,但由于我打算制作这个多人游戏,每个玩家都会有相同的图层蒙版。如果可能的话,我宁愿不再向其他玩家添加另一个图层蒙版。有没有其他方法可以避免玩家射击自己,而不使用图层蒙版?或者有没有一种实际的方法可以让其他玩家有一个单独的图层蒙版?

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    或者有没有一种实际的方法可以让其他玩家有一个单独的图层蒙版?

    由于Layers 需要预先定义并且限制为 32 层(Unity 已经预定义了 8 层),所以这个解决方案是可行的,是的,但不是非常可扩展,并且取决于您其余部分的复杂性应用非常有限。


    您可以使用RaycastAll,过滤掉if(hit != player),例如使用Linq Where,按距离排序,例如使用Linq OrderBy,然后使用结果中的第一个命中。

    有点像

    // Wherever you get these from
    Ray ray; // the ray with origin amd direction for the cast
    float distance; // if needed a maximum distance
    LayerMask layers; // the general raycast layer - not different ones for each player ;)
    GameObject player; // your player object
    
    
    var hits = Physics.RaycastAll(ray, distance, layers);
    
    if(hits.Length > 0)
    {
        // Filter out e.g. using Linq
        hits = hits.Where(hit => hit.gameObject != player).ToArray();
    
        if(hits.Length > 1)
        {
            // Sort by distance from ray origin
            hits = hits.OrderBy(hit => hit.distance).ToArray();
        }
    
        // Finally get first hit
        var hit = hits[0];
    
        // ...
    }
    

    【讨论】:

    • 所以,基本上,发射一个即使击中某物也会继续的 Raycast,忽略玩家,并在玩家之后获得第一个击中对象?
    • @JohnDoe 是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多