【问题标题】:Unity OnCollisionExit() not workingUnity OnCollisionExit()不起作用
【发布时间】:2018-04-25 19:46:49
【问题描述】:

我有一个玩家对象和一个名为 StartRamp 的坡道。我正在使用下面的代码来改变我的球员的位置和旋转到斜坡外的表面。当我的玩家离开坡道时,我想将玩家在 x 轴上的旋转更改为仅在 50,-50 之间。

但是当表面为假时我的 else 语句没有运行。这让我觉得我的 OnCollisionExit() 是错误的。有人可以帮我吗?

具有以下代码的脚本附加到播放器对象

private void OnCollisionStay(Collision collision)
{
    if(collision.gameObject.name == "StartRamp"){
        surface = true;
    }
}
private void OnCollisionExit(Collision collision)
{
    if (collision.gameObject.name != "StartRamp")
    {
        surface = false;
    }
}

public void playerToSurface(){

    if (surface == true){ // Change Position When On Ramp

        Ray ray = new Ray(transform.position, -transform.up);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 1.5f) == true)
        {
            Debug.DrawLine(transform.position, hit.point, Color.green);
            rotCur = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
            posCur = new Vector3(transform.position.x, hit.point.y, transform.position.z);
            grounded = true;
        }
        else
        {
            grounded = false;
        }
        if (grounded == true)
        {
            transform.rotation = Quaternion.Lerp(transform.rotation, rotCur, Time.deltaTime * 5);
        }
        else
        {
            transform.position = Vector3.Lerp(transform.position, transform.position - Vector3.up * 1f, Time.deltaTime * 5);
        }

    }else{ // Change Position When Off Ramp

        Debug.Log("Player is off ramp.\n");

    }
}

// Update player position to ground
private void Update()
{
    playerToSurface();
}

【问题讨论】:

  • 您不应该在退出时检查名称== "StartRamp" 吗?你有!=

标签: unity3d rotation position collision-detection raycasting


【解决方案1】:

由于 OnCollisionExit 正在寻找你 不再接触的对撞机,而不是你不接触的任何对撞机,你应该说对象名称 is startramp,不是不是

private void OnCollisionExit(Collision collision)
{
if (collision.gameObject.name == "StartRamp")
    {
        surface = false;
    }
}

【讨论】:

  • 我以前也有过,但我的性格物理反应不太一样
【解决方案2】:

我做了这个,它在统一中运行良好。

private void OnCollisionExit(Collision collision)
{
    if (collision.gameObject.name == "StartRamp")
    {
        surface.SetActive(false);
    }
}

【讨论】:

  • 表面是一个布尔值
  • 公共布尔曲面;是全局变量。在我的 else 语句中,表面 != true 改变了我的玩家物理和运动工作与我的 if 语句相比的方式。我该如何解决?让脊体以相同的方式移动,但允许我改变它的倾斜或旋转方式?
  • 这段代码正在发生这种情况。没有错误弹出它只是玩家物理与 if(surface == true) 语句的工作方式不同。 (问题)-----> else{ // 下坡时改变位置 Debug.Log("Player is off ramp.\n"); }
  • 你能看到检查器中的布尔值变化吗?
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多