Unity:尝试实施边缘爬升时,射线广播未记录命中

问题描述

我正在尝试在Unity中实现边缘爬升,但是Raycasts遇到了问题,它没有记录点击数

代码

using System.Linq;
using UnityEngine;

public class Playeredgeclimb : MonoBehavIoUr
{
    [Serializefield]
    Vector3Variable lookDirection;

    [Serializefield]
    float heightThreshold = 0.25f;

    [Serializefield]
    float raydistance = 0.05f;

    Vector3 hitclimbableStartPosition;
    Vector3 playerBottomPosition;
    Vector3 playerThresholdHeightPosition;
    Vector3 lookDirectionOffset;

    Rigidbody rb;

    void Start() {
        rb = GetComponent<Rigidbody>();
    }

    void Update() {
        lookDirectionOffset = lookDirection.Value * (transform.localScale.x / 2f);

        playerBottomPosition = transform.position + Vector3.down * transform.localScale.y / 2f;
        playerThresholdHeightPosition = Vector3.up * (transform.localScale.y * heightThreshold);

        var fudge = Vector3.up * 0.1f;
        
        hitclimbableStartPosition = playerBottomPosition + playerThresholdHeightPosition + lookDirectionOffset + fudge;
    }

    void FixedUpdate() {
        if (lookDirection.Value.x != 0) {
            if (CheckHitclimbable() && CheckCanclimbUnobstructed()) {
                transform.position += playerThresholdHeightPosition;
            }
        }
    }

    bool CheckHitclimbable() {
        float rayCount = 5f;
        float increment = transform.localScale.y * heightThreshold / rayCount;

        Vector3 rayPosition = hitclimbableStartPosition;

        foreach (var index in Enumerable.Range(0,(int)rayCount - 1))
        {
            Ray ray = new Ray(rayPosition,lookDirection.Value);

            RaycastHit hit;

            if (Physics.Raycast(ray,out hit,raydistance)) {
                Debug.DrawLine(rayPosition,rayPosition + lookDirection.Value * raydistance,Color.red);
                return true;
            } else {
                Debug.DrawLine(rayPosition,Color.black);
                rayPosition += Vector3.down * increment;
            }
        }

        return false;
    }

    bool CheckCanclimbUnobstructed() {
        float rayCount = 20f;
        float increment = transform.localScale.y / rayCount;

        Vector3 rayPosition = hitclimbableStartPosition;

        foreach (var index in Enumerable.Range(0,transform.localScale.x)) {
                Debug.DrawLine(rayPosition,rayPosition + lookDirection.Value * transform.localScale.x,Color.red);
                return false;
            } else {
                Debug.DrawLine(rayPosition,Color.green);
                rayPosition += Vector3.up * increment;
            }
        }

        return true;
    }

    void OnDrawGizmos() {
        Gizmos.color = Color.green;

        Gizmos.DrawCube(hitclimbableStartPosition,new Vector3(0.1f,0.1f,0.1f));
    }
}

行为视频:https://twitter.com/testingrequired/status/1294433037996953600

编辑

因此,将射线距离(增加到0.33)和使用的射线数量增加到11)大大地帮助了

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)