Bài viết phổ biến của tác giả
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的平台游戏的光线转换 Controller 的功能之一是玩家可以跳下单向平台。这很好用,但我想添加额外的功能,让玩家只有在他或她要跳到的平台在一定距离内时才能跳下去。
我的平台 Controller 的跳下功能是这样工作的:
我已经尝试制作一个跳下方法,从角色的盒子碰撞器的中心创建一个新的光线转换(下面的代码中没有显示,因为到目前为止我完全不成功),并检查碰撞一定的距离。我的问题是它总是检测到它即将跳下的平台的碰撞器,而永远没有机会检测到其他任何东西。
我如何让这个新的光线转换忽略第一次碰撞,潜在地检测光线距离内的碰撞,如果它撞到什么东西让我的角色跳下来?另外,我什至需要做一个新的光线转换,还是我可以只使用我 Controller 上的当前光线转换?
这是我的一些光线转换 Controller 脚本,希望能解释一些功能:
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;
1 Câu trả lời
实际上,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);
}
}
}
关于c# - Unity2D/C# : How do I make a raycast ignore its first collision?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247840/
Tôi là một lập trình viên xuất sắc, rất giỏi!