如何在碰撞时平滑旋转角色?

时间:2017-02-21 09:58:03

标签: c# unity3d unity5

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BoxCollider : MonoBehaviour {

    private float degree = 180f;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

    void OnTriggerEnter(Collider c)
    {
        GameObject character = GameObject.Find(c.name);
        character.transform.rotation = Quaternion.Slerp(character.transform.rotation, Quaternion.Euler(0, 0, degree), Time.deltaTime);
    }
}

我有两个ThirdPersonController字符。 触发事件OnTriggerEnter时,我在c.Name“ThirdPersonController”

中看到

我还添加了4个空游戏对象,每个对象都添加了一个盒子对撞机设置IsTrigger,并且还附加了每个游戏对象这个脚本。

当我检查角色到达墙壁时,他们停止移动,但继续走在原地。

现在我想要触发事件旋转180度的当前角色(或两者)。但相反,它并没有进行旋转,因此我认为在z轴上某些程度上改变的角色会不断地走出地形。

我猜我在Quaternion.Slerp系列上做错了。

1 个答案:

答案 0 :(得分:0)

使用Collider.gameObject

由于你有两个同名的游戏对象,你的GameObject.Find(c.name)行总会返回相同的一行,无论Collider实际触发了什么{。}}。

与直接使用GameObject.Find的gameObject属性相比,

Collider也非常慢,所以您要避免尽可能频繁地使用“查找”。

以下是修改后的版本:

void OnTriggerEnter(Collider c)
{
    // Don't use GameObject.Find here - just use the gameObject ref on the given collider:
    GameObject character = c.gameObject;

    character.transform.rotation = Quaternion.Slerp(character.transform.rotation, Quaternion.Euler(0, 0, degree), Time.deltaTime);
}

Time.deltaTime仅供更新

这只是一个相当随机,非常小的数字。