Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于碰撞检查,我的统一角色偶尔会从地板上掉下来。我能做些什么来解决这个问题?_C#_Unity3d - Fatal编程技术网

C# 由于碰撞检查,我的统一角色偶尔会从地板上掉下来。我能做些什么来解决这个问题?

C# 由于碰撞检查,我的统一角色偶尔会从地板上掉下来。我能做些什么来解决这个问题?,c#,unity3d,C#,Unity3d,我有一个基本的面向2D的角色控制器-自定义,我正在为一个带有3D模型的2.5D游戏编写(因此我不能使用Unity2D物理和碰撞体积) 我的控制器大部分工作正常,但我遇到了一个奇怪的小问题,每隔一段时间——显然是以一定的速度——它就会跳过碰撞检查,掉到地板或平台上。有人能看出我做错了什么吗 using UnityEngine; using System.Collections; public class PlayerController : MonoBehaviour { public floa

我有一个基本的面向2D的角色控制器-自定义,我正在为一个带有3D模型的2.5D游戏编写(因此我不能使用Unity2D物理和碰撞体积)

我的控制器大部分工作正常,但我遇到了一个奇怪的小问题,每隔一段时间——显然是以一定的速度——它就会跳过碰撞检查,掉到地板或平台上。有人能看出我做错了什么吗

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> <代码>或添加速度。

我完成了一个完整的重写,并应用了一个字符控制器代替了上面的内容,现在事情变得更加平滑了。我想我有点野心勃勃,想用光线投射和其他工具来编写一个完全定制的控制器。