0

Unity で 3D ゲームオブジェクトをスピンしようとしています。それは実際には、ポーカー チップのテクスチャーがついた円柱です。レイキャストと衝突したら、360 度回転させたいと思います。Unity エミュレーターでは正常に動作していますが、デバイス自体では、チップはスピン後に停止し、無限ループでスピンし続けます。問題のコードのスニペットを次に示します。事前に助けてくれてありがとう。

    // Spin the chip
if (Animate) {
    if (Speed > 0 && Chip.tag.Contains("Chip")) {
        Chip.transform.Rotate(0, Speed*Time.deltaTime, 0);
        Speed -= 3;
        Debug.Log(Speed);
    }
    else {
        // Reset
        Animate = false;
        Speed = 360;
        Chip.transform.localRotation = Quaternion.Euler(0.0,0.0,0.0);
    }   
}

これを要約すると、レイキャストなどで衝突するとゲームオブジェクトチップが割り当てられます

// Set the chip
    Chip = hit.transform;

すべては update 関数で行われます。レイキャストがヒットすると、賭け関数が呼び出され、賭けが計算された後、Boolean Animate が true に変更され、チップが回転します。

4

4 に答える 4

0

James Gramosli は、他のコードがアニメーションを再びトリガーしているという点で正しいです。それはタッチ コードである可能性が最も高いです。これは、エディターとタッチ対応デバイスの間を移動するときによくある問題です。UnityRemote を使用してコードの制御フローを検証することで、これに該当するかどうかを判断できます。

そうは言っても、コードを次のように変更して、すべてのフレームを実行する Update ループからスピン コードを削除します。これは小さな最適化ですが、主にアーキテクチャをクリーンアップし、よりモジュール化して少しきれいにします。

コード スニペットからは明確ではありませんが、UnityScript を使用していると仮定します。

チップをクリックしたときにタッチ コードを処理するスクリプトに、次の行を挿入します。

hit.transform.SendMessage("Spin", hit.transform, SendMessageOptions.DontRequireReceiver);

このコードを「SpinChip」という別のスクリプトに入れ、そのスクリプトをチップ オブジェクトに追加します。

var StartSpeed = 360.0;
var Deceleration = 3.0;

function Spin()
{
    if (Animating)
    {
        print("Chip is already spinning, not starting another animation");
        return;
    }

/*
    This code isn't necessary if this exists in a separate script and is only ever attached to the clickable chip
    if (!gameObject.tag.Contains("Chip"))
    {
        print("That wasn't a chip you clicked");
        return;
    }
*/

    print("Chip has been told to spin");
    StartCoroutine(SpinningAnimation);
}

function SpinningAnimation()
{
    print("Chip spin start");
    transform.localRotation = Quaternion.identity;
    Speed = StartSpeed;
    Animating = true;
    while (Speed > 0)
    {
        transform.Rotate(0, Speed*Time.deltaTime, 0);
        Speed -= Deceleration;
        yield; // wait one frame
    }

    print("Chip has completed the spin");
    Animating = false;
}

このコードが行うことは、アクティブ化されたときに更新ループごとに 1 回実行されるコルーチンを作成することです。これは、チップをスピンし、実際のボタン クリック コードとは無関係です。

于 2013-05-19T04:37:39.467 に答える
0

あなたの更新機能で。Bool 変数 Animate が true になることがあります。これが、シリンダーが回転し続ける理由かもしれません。

その他の解決策は次のとおりです。シリンダーのアニメーションを作成してから、ストップウォッチを取ることができます。しばらくすると、ストップウォッチの時間を使用してアニメーションを停止できます

于 2015-02-05T09:48:28.890 に答える
0
var rotSpeed: float = 60; // degrees per second

function Update(){
  transform.Rotate(0, rotSpeed * Time.deltaTime, 0, Space.World);
}

これは、ゲーム オブジェクトを回転させるコードです。ベクター 3 だけで使用できます。transform.Rotate(x, y, z);または、スペースtransform.Rotate(x, y, z, Space.World); rotSpeedで回転速度を指定します。

于 2013-08-09T08:11:37.443 に答える
0

他のコードで何かが設定Animate = trueされており、残りの部分を見ずに何が起こっているのかを判断するのは困難です。

Animate が true に設定されているすべての場所の横にデバッグを配置すると、別の設定が表示され、回転し続ける理由についての可能な説明のみが表示されます。

もう 1 つのオプションは、アニメーション ツールを使用することです。回転する代わりに、回転を実行するアニメーションを再生するだけです。

編集:タッチコードの周りにチャンスがあります。これは、エディターでキーストロークを使用してデバッグするときに発生します。何度か経験した落とし穴。

于 2012-05-20T23:19:18.327 に答える