C# 由于碰撞检查,我的统一角色偶尔会从地板上掉下来。我能做些什么来解决这个问题?
我有一个基本的面向2D的角色控制器-自定义,我正在为一个带有3D模型的2.5D游戏编写(因此我不能使用Unity2D物理和碰撞体积) 我的控制器大部分工作正常,但我遇到了一个奇怪的小问题,每隔一段时间——显然是以一定的速度——它就会跳过碰撞检查,掉到地板或平台上。有人能看出我做错了什么吗C# 由于碰撞检查,我的统一角色偶尔会从地板上掉下来。我能做些什么来解决这个问题?,c#,unity3d,C#,Unity3d,我有一个基本的面向2D的角色控制器-自定义,我正在为一个带有3D模型的2.5D游戏编写(因此我不能使用Unity2D物理和碰撞体积) 我的控制器大部分工作正常,但我遇到了一个奇怪的小问题,每隔一段时间——显然是以一定的速度——它就会跳过碰撞检查,掉到地板或平台上。有人能看出我做错了什么吗 using UnityEngine; using System.Collections; public class PlayerController : MonoBehaviour { public floa
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour
{
public float PlayerSpeed;
public float JumpPower;
public float _Gravity = 9.89f;
public Vector3 Flip = Vector3.zero;
private Vector3 MoveDirection = Vector3.zero;
private bool FacingLeft = false;
private bool FacingRear = false;
public bool GroundContact = false;
private Rigidbody RigidBody;
private void Awake()
{
RigidBody = GetComponent<Rigidbody>();
}
private void Update()
{
DetectionRays();
MoveDirection.x = PlayerSpeed * Input.GetAxis("Horizontal");
if (GroundContact) {
MoveDirection.y = 0;
if (Input.GetButtonDown("Jump")) {
MoveDirection.y = JumpPower;
}
} else {
MoveDirection.y -= _Gravity * Time.deltaTime;
}
Vector3 movementVector = new Vector3(MoveDirection.x * Time.deltaTime, MoveDirection.y * Time.deltaTime, 0);
transform.Translate(movementVector);
}
private void DetectionRays()
{
DetectDown();
}
private void OnCollisionEnter(Collision Collide)
{
if (Collide.transform.tag == "Ground")
{
GroundContact = true;
}
}
private void DetectDown()
{
RaycastHit Obsticle;
Vector3 RayDownPosit = transform.position;
RayDownPosit.y += 0.8f;
Ray RayDown = new Ray(transform.position, Vector3.down);
Debug.DrawRay(RayDownPosit, Vector3.down, Color.red, 0.05f, false);
GroundContact = false;
if (Physics.Raycast(RayDown, out Obsticle, 0.05f))
{
if (Obsticle.transform.tag == "Ground")
{
GroundContact = true;
}
}
}
}
使用UnityEngine;
使用系统集合;
公共类玩家控制器:单行为
{
公众花车运动员速度;
公共权力;
公共浮子_重力=9.89f;
公共向量3翻转=向量3.0;
专用矢量3移动方向=矢量3.0;
private bool FacingLeft=假;
专用bool面向后部=错误;
公共布尔地面接触=错误;
私人刚体;
私人空间
{
刚体=GetComponent();
}
私有void更新()
{
探测射线();
MoveDirection.x=播放器速度*Input.GetAxis(“水平”);
如果(地面联络){
移动方向y=0;
if(Input.GetButtonDown(“跳转”)){
MoveDirection.y=跳线功率;
}
}否则{
MoveDirection.y-=\u Gravity*Time.deltaTime;
}
Vector3 movementVector=新的Vector3(MoveDirection.x*Time.deltaTime,MoveDirection.y*Time.deltaTime,0);
transform.Translate(移动向量);
}
私有void DetectionRays()
{
DetectDown();
}
专用void OnCollisionEnter(碰撞碰撞)
{
if(Collide.transform.tag==“地面”)
{
地面接触=真;
}
}
私有void DetectDown()
{
雷卡斯特障碍;
Vector3 RayDownPosit=变换位置;
Raydownposite.y+=0.8f;
光线向下=新光线(transform.position,Vector3.down);
Debug.DrawRay(光线衰减,矢量3.down,彩色,红色,0.05f,假);
地面接触=假;
if(物理.光线投射(光线向下,向外观察,0.05f))
{
if(Obsticle.transform.tag==“地面”)
{
地面接触=真;
}
}
}
}
首先,可以将长方体碰撞器2D和刚体2D附加到三维模型。试试看
您确定需要自定义角色控制器吗CharacterController.Move
(或SimpleMove
)为您执行碰撞检测
另一方面,由于你使用刚体,你应该考虑使用<代码> Apple yRe> <代码>或添加速度。
我完成了一个完整的重写,并应用了一个字符控制器代替了上面的内容,现在事情变得更加平滑了。我想我有点野心勃勃,想用光线投射和其他工具来编写一个完全定制的控制器。