3

横スクロールシューティングゲームに取り組んでいます。私は横スクロールシューティングゲームのキャラクターをこれらで見回しました:

chest.LookAt(mousepos, Vector3.right);

&

chest.LookAt(mousepos, Vector3.left);

(キャラを左右に向けると左、右に向けると右)

そのため、他の軸に狙いを定めることはありません...しかし、マウスがキャラクターの周りではなくキャラクターの中央を横切ると、回転してフレーム間の小さな移動が行われ、そこまで到達しません.. LookAt のように正しい回転にテレポートするだけです。

問題は、Time.deltTime で動作するクォータニオン slerp を LookAt(x,Vector3.Right) と同じように動作させるにはどうすればよいかということです。Vector3.right と left が必要なので、1 軸で移動します。

私を助けてくれた人に感謝します。:)

4

1 に答える 1

1

ターゲット ベクトルと開始ベクトルを用意し、ユーザーがマウスをキャラクターの左または右に移動したときにそれらを設定し、更新関数でそれらの間でVector3.Slerpを使用します。

bool charWasFacingLeftLastFrame = false.
Vector3 targetVector = Vector3.zero;
Vector3 startVector = Vector3.zero;
float startTime = 0f;
float howLongItShouldTakeToRotate = 1f;

void Update () {
    Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    Vector3 characterPos = character.transform.position;

    //check if mouse is left or right of character
    if(mouseWorldPos.x < characterPos.x) {
        //char should be facing left
        //only swap direction if the character was facing the other way last frame      
        if(charWasFacingLeftLastFrame == false) {
            charWasFacingLeftLastFrame = true;
            //we need to rotate the char
            targetVector = Vector3.left;
            startVector = character.transform.facing;
            startTime = Time.time;
        }
    } else {
        //char should be facing right
        //only swap direction if the character was facing the other way last frame      
        if(charWasFacingLeftLastFrame == true) {
            //we need to rotate the char;
            charWasFacingLeftLastFrame = false
            targetVector = Vector3.right;
            startVector = character.transform.facing;
            startTime = Time.time;
        }
    }

    //use Slerp to update the characters facing
    float t = (Time.time - startTime)/howLongItShouldTakeToRotate;
    character.transform.facing = Vector3.Slerp(startVector, targetVector, t);
}
于 2012-11-06T00:30:36.650 に答える