我的平台游戏的光线投射控制器的一个功能是玩家可以通过单向平台跳下来。这很好用,但是我想添加额外的功能,只有当他或她跳跃的平台在一定距离内时,玩家才能跳下来。
我的平台控制器的跳跃功能如下:
我试过制作一个跳转方法,从角色的盒子对撞机的中心创建一个新的光线投射(下面的代码中没有显示,因为到目前为止我完全没有成功),并且检查了碰撞一定的距离。我的问题是它总能检测到它将要从中跳下的平台的对撞机,并且永远不会有机会检测到其他任何东西。
如何让这个新的光线投射忽略第一次碰撞,可能会检测到光线距离内的碰撞,如果碰到了什么让我的角色跳下来?另外,我是否需要进行新的光线投射,或者我可以在控制器上使用当前的光线投射?
这里有一些我的raycast控制器脚本,希望能够解释一些功能:
private void MoveVertically(ref Vector3 deltaMovement)
{
float directionY = Mathf.Sign(deltaMovement.y);
float rayLength = Mathf.Abs(deltaMovement.y) + skinWidth;
for (int i = 0; i < verticalRayCount; i++)
{
Vector2 rayOrigin = (directionY == -1) ? raycastOrigins.bottomLeft : raycastOrigins.topLeft;
rayOrigin += Vector2.right * (verticalRaySpacing * i + deltaMovement.x);
RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.up * directionY, rayLength, collisionMask);
Debug.DrawRay(rayOrigin, Vector2.up * directionY * rayLength, Color.red);
if (hit)
{
if (hit.collider.tag == "platformOneWay")
{
if (directionY == 1)
{
State.IsCollidingWithOneWay = true;
State.IsCollidingAbove = false;
continue;
}
if (CanJumpDown)
{
State.IsCollidingBelow = false;
continue;
}
}
deltaMovement.y = (hit.distance - skinWidth) * directionY;
rayLength = hit.distance;
答案 0 :(得分:5)
实际上,Unity3D提供了一个名为Physics2D.RaycastAll
的API,它不仅返回第一个光线投射命中,而且还返回最大距离内的所有光线投射命中数。
Physics2D.RaycastAll
将两个Vector2
作为参数(光线投射原点和方向)并返回RaycastHit2D
数组,该数组按原点到点的距离排序。
这里有一些代码可以显示这个函数的作用:
public class Raycaster : MonoBehaviour
{
private void Start()
{
RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, Vector2.down);
for (int i = 0; i < hits.Length; ++i)
{
Debug.LogFormat("The name of collider {0} is \"{1}\".",
i, hits[i].collider.gameObject.name);
}
}
}
答案 1 :(得分:0)
另一种方法是创建LayerMasks。在Unity编辑器中创建一个新图层,并将图层分配给与对象相连的游戏对象。
使用LayerMask.GetMask
在代码中获取图层蒙版ID,并将其添加为参数。现在你的Raycast只会投射分配给图层的碰撞者。
var layerMask = LayerMask.GetMask ("myLayerName");
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast (ray, out hit, 100.0f, layerMask)) {
Debug.Log ("Got ya!");
}