私はしばらく何か試してきましたが、なぜ動作していないのかわかりません。 私はPathHolderの親に単純なパスの空のオブジェクトとそのパスに続く文字オブジェクトを持っていて、それが向いているポイントに向かって滑らかに回転します。私の問題は時間の半分であり、キャラクタオブジェクトは完全に回転せず、まだその点に向かって動きます。 もう一つ変わったことは、ポイントを近づけるとオブジェクトがどれくらい回転するかが減少し、それをさらに動かすと文字がポイントに向くことになります。しかし、どのような状況でも動作するようにパスを柔軟にする必要があるため、距離を回転に影響させることはできません。Quaternion.LookRotationの角度が正しく機能していない
理想的には、矢印キーを押したときにキャラクターが完全にスムーズに回転して、プレイヤーがキーを離したときにキャラクターが途中で止まらないようにしたいと思っています。 -
using UnityEngine;
using System.Collections;
public class CharacterControllerPath : MonoBehaviour
{
enum Direction {Forward, Backward};
Direction charDirection;
public PathEditor pathToFollow;
private Vector3 targetPosition;
public string pathName;
public int wayPointID = 0;
public float speed;
public float rotationSpeed = 7.0f;
private float reachDistance = 1.0f;
private float distanceX;
private float distanceY;
void Start()
{
transform.position = new Vector3(pathToFollow.pathObj[wayPointID].transform.position.x, transform.position.y, pathToFollow.pathObj[wayPointID].transform.position.z);
charDirection = Direction.Forward;
Vector3 targetPosition = new Vector3(pathToFollow.pathObj[wayPointID + 1].transform.position.x, transform.position.y, pathToFollow.pathObj[wayPointID + 1].transform.position.z);
transform.LookAt(targetPosition);
}
void FixedUpdate()
{
Movement();
}
void Movement()
{
if(Input.GetKey(KeyCode.RightArrow))
{
charDirection = Direction.Forward;
//Move
targetPosition = new Vector3(pathToFollow.pathObj[wayPointID].transform.position.x, transform.position.y, pathToFollow.pathObj[wayPointID].transform.position.z);
transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
//Rotate
targetPosition = new Vector3(pathToFollow.pathObj[wayPointID].transform.position.x, 0, pathToFollow.pathObj[wayPointID].transform.position.z);
var rotation = Quaternion.LookRotation(targetPosition);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, speed * Time.deltaTime);
if(transform.position.x == targetPosition.x && transform.position.z == targetPosition.z)
wayPointID++;
}
else if(Input.GetKey(KeyCode.LeftArrow))
{
charDirection = Direction.Backward;
//Move
targetPosition = new Vector3(pathToFollow.pathObj[wayPointID - 1].transform.position.x, transform.position.y, pathToFollow.pathObj[wayPointID - 1].transform.position.z);
transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed * Time.deltaTime);
//Rotate
targetPosition = new Vector3(pathToFollow.pathObj[wayPointID - 1].transform.position.x, 0, pathToFollow.pathObj[wayPointID - 1].transform.position.z);
var rotation = Quaternion.LookRotation(targetPosition);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, speed * Time.deltaTime);
if(transform.position.x == targetPosition.x && transform.position.z == targetPosition.z)
wayPointID--;
}
if(wayPointID >= pathToFollow.pathObj.Count)
{
//Put code to finish the level
wayPointID = (pathToFollow.pathObj.Count - 1);
}
else if(wayPointID <= 0)
wayPointID = 0;
}
}
私は 'pathToFollow'のポイントをworld-relativeと仮定しますか?キャラクタをその方向に見たい場合は、そのキャラクタに関連するベクトルを与えていることを確認する必要があります。 – rutter
すぐにお返事ありがとうございます!しかし、私はあなたが何を言っているのか十分に理解していません。 – Septos
Unityの何らかの理由でクォータニオンを使用しないでください。単に "LookAt"を使用してください。https://docs.unity3d.com/ScriptReference/Transform.LookAt.html – Fattie