如何始终根据我的轴方向移动我的对象?
How can I move my object based on my axis direction at all times?
我正在尝试将我的球移动到固定距离。
为此,我使用了一些 Vector3 和 Lerping。
但是当我的物体旋转时,球仍然在同一个方向运动,而不是在我的X轴方向设置的新方向上运动。我在代码的注释中添加了更多我想要完成的细节。
public float timeTakenDuringLerp = 1f;
/// <summary>
/// How far the object should move when 'UpArrow' is pressed
/// </summary>
public float distanceToMove = 7; //value can be change in unity
//Whether we are currently interpolating or not
private bool _isLerping;
//The start and finish positions for the interpolation
private Vector3 _startPosition;
private Vector3 _endPosition;
//The Time.time value when we started the interpolation
private float _timeStartedLerping;
Vector3 myVector;
/// <summary>
/// Called to begin the linear interpolation
/// </summary>
void StartLerping1()
{
_isLerping = true;
_timeStartedLerping = Time.time;
//We set the start position to the current position, and the finish to 7 spaces in the 'forward' direction
_startPosition = transform.position;
myVector = new Vector3(1, 0, 0);
_endPosition = transform.position + myVector * distanceToMove;
}
void Update()
{
//When the user hits the up arrow, we start lerping
if (Input.GetKey(KeyCode.UpArrow))
{
StartLerping1();
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
// THE ROTATION IS SUPPOSED TO HAPPEN, AND THE MOVEMENT SHOULD BE BASED ON THIS NEW DIRECTION
}
}
//We do the actual interpolation in FixedUpdate(), since we're dealing with a rigidbody
void FixedUpdate()
{
if (_isLerping)
{
//We want percentage = 0.0 when Time.time = _timeStartedLerping
//and percentage = 1.0 when Time.time = _timeStartedLerping + timeTakenDuringLerp
//In other words, we want to know what percentage of "timeTakenDuringLerp" the value
//"Time.time - _timeStartedLerping" is.
float timeSinceStarted = Time.time - _timeStartedLerping;
float percentageComplete = timeSinceStarted / timeTakenDuringLerp;
//Perform the actual lerping. Notice that the first two parameters will always be the same
//throughout a single lerp-processs (ie. they won't change until we hit the space-bar again
//to start another lerp)
transform.position = Vector3.Lerp(_startPosition, _endPosition, percentageComplete);
//When we've completed the lerp, we set _isLerping to false
if (percentageComplete >= 1.0f)
{
_isLerping = false;
}
}
}
当你说
myVector = new Vector3(1, 0, 0); //you can short hand to myVector = Vector3.right
你在世界上声明了一个指向右边的向量(是的,(1, 0, 0) 是正确的,而不是向前)space,unity 将使用右上角的那个小轴在场景视图中作为应用动作的参考,
旋转时不会改变。
你想要做的是使用 GameObject 的变换作为参考,这是一个考虑了旋转的局部 space 坐标,而不是
myVector = Vector3.forward;
尝试
myVector = transform.forward;
并在该方向上应用移动。
我正在尝试将我的球移动到固定距离。 为此,我使用了一些 Vector3 和 Lerping。
但是当我的物体旋转时,球仍然在同一个方向运动,而不是在我的X轴方向设置的新方向上运动。我在代码的注释中添加了更多我想要完成的细节。
public float timeTakenDuringLerp = 1f;
/// <summary>
/// How far the object should move when 'UpArrow' is pressed
/// </summary>
public float distanceToMove = 7; //value can be change in unity
//Whether we are currently interpolating or not
private bool _isLerping;
//The start and finish positions for the interpolation
private Vector3 _startPosition;
private Vector3 _endPosition;
//The Time.time value when we started the interpolation
private float _timeStartedLerping;
Vector3 myVector;
/// <summary>
/// Called to begin the linear interpolation
/// </summary>
void StartLerping1()
{
_isLerping = true;
_timeStartedLerping = Time.time;
//We set the start position to the current position, and the finish to 7 spaces in the 'forward' direction
_startPosition = transform.position;
myVector = new Vector3(1, 0, 0);
_endPosition = transform.position + myVector * distanceToMove;
}
void Update()
{
//When the user hits the up arrow, we start lerping
if (Input.GetKey(KeyCode.UpArrow))
{
StartLerping1();
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
// THE ROTATION IS SUPPOSED TO HAPPEN, AND THE MOVEMENT SHOULD BE BASED ON THIS NEW DIRECTION
}
}
//We do the actual interpolation in FixedUpdate(), since we're dealing with a rigidbody
void FixedUpdate()
{
if (_isLerping)
{
//We want percentage = 0.0 when Time.time = _timeStartedLerping
//and percentage = 1.0 when Time.time = _timeStartedLerping + timeTakenDuringLerp
//In other words, we want to know what percentage of "timeTakenDuringLerp" the value
//"Time.time - _timeStartedLerping" is.
float timeSinceStarted = Time.time - _timeStartedLerping;
float percentageComplete = timeSinceStarted / timeTakenDuringLerp;
//Perform the actual lerping. Notice that the first two parameters will always be the same
//throughout a single lerp-processs (ie. they won't change until we hit the space-bar again
//to start another lerp)
transform.position = Vector3.Lerp(_startPosition, _endPosition, percentageComplete);
//When we've completed the lerp, we set _isLerping to false
if (percentageComplete >= 1.0f)
{
_isLerping = false;
}
}
}
当你说
myVector = new Vector3(1, 0, 0); //you can short hand to myVector = Vector3.right
你在世界上声明了一个指向右边的向量(是的,(1, 0, 0) 是正确的,而不是向前)space,unity 将使用右上角的那个小轴在场景视图中作为应用动作的参考,
旋转时不会改变。
你想要做的是使用 GameObject 的变换作为参考,这是一个考虑了旋转的局部 space 坐标,而不是
myVector = Vector3.forward;
尝试
myVector = transform.forward;
并在该方向上应用移动。