如何解决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 举报,一经查实,本站将立刻删除。