2

現在、作成したスクリプトに少し問題があります。基本的に、ゲームオブジェクト (名前を A にします) を作成し、別のゲームオブジェクト (名前は B) の位置をたどるスクリプトを作成したいと考えています。それを行う簡単な方法は A を B に親にすることだとわかっていますが、2 つの理由でそれを行っていません。2) A を B の位置や回転に自由に追従させたい。

ここに私が書いたスクリプトがあります:

using UnityEngine;
using System.Collections;

public class FollowGameObject : MonoBehaviour {

public GameObject m_GameObjectToFollow;
public bool m_FollowPosition;
public bool m_FollowRotation;
public float m_PositionSmoothing;
public float m_RotationSmoothing;
// Should not be changed once set
public bool m_UseOffsetPosition;
public bool m_UseOffsetRotation;
private Vector3 m_PositionOffset;
private Quaternion m_RotationOffset;

void Start () {

    m_PositionSmoothing = Mathf.Clamp(m_PositionSmoothing, 0.0f, 1.0f);
    m_RotationSmoothing = Mathf.Clamp(m_RotationSmoothing, 0.0f, 1.0f);

    if (m_UseOffsetPosition)
    {
        m_PositionOffset = transform.position - m_GameObjectToFollow.transform.position;
    } else {
        m_PositionOffset = Vector3.zero;
    }

    if (m_UseOffsetRotation)
    {
        m_RotationOffset = transform.rotation * Quaternion.Inverse(m_GameObjectToFollow.transform.rotation);
    } else {
        m_RotationOffset = Quaternion.identity;
    }

}

void FixedUpdate () {

    if (m_FollowPosition) {
        Vector3 goalPosition = m_GameObjectToFollow.transform.position + m_PositionOffset;
        transform.position = Vector3.Lerp(transform.position, goalPosition, m_PositionSmoothing);
        //transform.Translate(newPosition - transform.position, Space.World);
    }

    if (m_FollowRotation) {
        Quaternion goalRotation = m_GameObjectToFollow.transform.rotation * m_RotationOffset;
        transform.rotation = Quaternion.Lerp(transform.rotation, goalRotation, m_RotationSmoothing);
    }

}

コードが簡単に理解できることを願っています。そうでない場合は、お気軽にお問い合わせください。いずれにせよ、このスクリプトを A にアタッチし、そのm_GameObjectToFollowアトリビュートを B に割り当てると (B はキャラクタ コントローラをペアレント化しており、球体レンダラーを A にペアレント化して、B に正しく追従しているかどうかを確認できます)、A が確かに B に従いますが、その位置 (球レンダラーを介して) が「正しい」位置 (B) と別の位置の間で「変動」していることがわかります。視覚的には、球体がちらつきます。スムージング値を 1 に設定してみました (つまり、A は常に B の位置/回転にある必要があります)。まだちらつきが見えます。

誰かが私が間違ったことを説明してもらえますか?

編集:私はLerpを最後の値で間違った方法で使用しているようです。スムージング値の代わりに速度値を使用するようにスクリプトを修正しましたが、(より低い速度値で) 滑らかな動きを作成しようとすると、同じ問題が発生します。問題を適切に説明するのに苦労しています。問題がどのように見えるかを確認する最善の方法は、実際に体験してみることです: 1) 地形とキャラクター コントローラーを含むシーンを作成します。2) メイン カメラをコントローラーにペアレント化します (コントローラーが常に追従するようにします)。3) レンダラー (球体など) を使用して新しいゲームオブジェクトを作成し、他のゲームオブジェクトを親にせずに、次のスクリプトをそれに添付します。

using UnityEngine;

System.Collections を使用します。

public class FollowGameObject : MonoBehaviour {

public GameObject m_GameObjectToFollow;
public bool m_FollowPosition;
public bool m_FollowRotation;
// Betzeen 0 and 1. 1 means that a complete unsmoothed follow
public float m_PositionFollowSpeed;
public float m_RotationFollowSpeed;
// Should not be changed once set
public bool m_UseOffsetPosition;
public bool m_UseOffsetRotation;
private Vector3 m_PositionOffset;
private Quaternion m_RotationOffset;

void Start () {

    if (m_UseOffsetPosition)
    {
        m_PositionOffset = transform.position - m_GameObjectToFollow.transform.position;
    } else {
        m_PositionOffset = Vector3.zero;
    }

    if (m_UseOffsetRotation)
    {
        m_RotationOffset = transform.rotation * Quaternion.Inverse(m_GameObjectToFollow.transform.rotation);
    } else {
        m_RotationOffset = Quaternion.identity;
    }

}

void Update () {

    if (m_FollowPosition) {
        Vector3 goalPosition = m_GameObjectToFollow.transform.position + m_PositionOffset;
        transform.position = Vector3.Slerp(transform.position, goalPosition, Time.deltaTime * m_PositionFollowSpeed);
    }

    if (m_FollowRotation) {
        Quaternion goalRotation = m_GameObjectToFollow.transform.rotation * m_RotationOffset;
        transform.rotation = Quaternion.Slerp(transform.rotation, goalRotation, Time.deltaTime * m_RotationFollowSpeed);
    }

}

}

m_GameObjectToFollow = キャラクター コントローラーのゲームオブジェクト。

m_FollowPosition = true;

m_PositionFollowSpeed = 10;

(このテストでは、他のパラメーター値は重要ではありません)

シーンを開始してキャラクター コントローラーを動かすと、モーション中に球体がちらつきますが、動きを止めるとスムーズにコントローラーに移動します。

4

1 に答える 1