【发布时间】:2021-03-18 04:30:53
【问题描述】:
我正在制作一款 FPS 游戏,玩家可以在瞄准时射击自己。如果我添加一个图层蒙版,它是固定的,但由于我打算制作这个多人游戏,每个玩家都会有相同的图层蒙版。如果可能的话,我宁愿不再向其他玩家添加另一个图层蒙版。有没有其他方法可以避免玩家射击自己,而不使用图层蒙版?或者有没有一种实际的方法可以让其他玩家有一个单独的图层蒙版?
【问题讨论】:
标签: unity3d
我正在制作一款 FPS 游戏,玩家可以在瞄准时射击自己。如果我添加一个图层蒙版,它是固定的,但由于我打算制作这个多人游戏,每个玩家都会有相同的图层蒙版。如果可能的话,我宁愿不再向其他玩家添加另一个图层蒙版。有没有其他方法可以避免玩家射击自己,而不使用图层蒙版?或者有没有一种实际的方法可以让其他玩家有一个单独的图层蒙版?
【问题讨论】:
标签: unity3d
或者有没有一种实际的方法可以让其他玩家有一个单独的图层蒙版?
由于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];
// ...
}
【讨论】: