gpt4 book ai didi

c# - 应遵循另一个 GameObject 位置的脚本的问题

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:08 25 4
gpt4 key购买 nike

我目前制作的脚本有点问题。基本上,我想创建一个脚本,使其成为游戏对象(我们将其命名为 A)并跟随另一个游戏对象(命名为 B)的位置。我知道一个简单的方法是让 A 成为 B 的 parent ,但我没有这样做有两个原因:1) 我希望能够对 A 的运动应用平滑(我可以更改其值);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 是角色 Controller 的父级,并且我将球体渲染器作为 A 的父级,以便我可以查看它是否遵循 B正确),我注意到 A 确实跟随 B,但我看到它的位置(通过球体渲染器)在“正确”位置(B)和另一个位置之间“波动”。视觉上,球体在闪烁。我尝试将平滑值设置为 1(即 A 应始终处于 B 的位置/旋转)。我仍然看到闪烁。

有人可以向我解释我做错了什么吗?

EDIT :似乎我使用 Lerp 的最后一个值的方式不对。我修改了脚本以使用速度值而不是平滑值,但是当我尝试创建一些平滑运动(使用较低的速度值)时仍然存在相同的问题。我无法正确解释问题。查看问题的最佳方法是亲自体验:1)创建一个场景,其中有一个地形和一个角色 Controller ;2) 将主摄像机作为 Controller 的父级(以便它始终跟随它);3) 创建一个带有渲染器(例如,球体)的新游戏对象,而不是任何其他游戏对象的父级,但将以下脚本附加到它:

using UnityEngine;

使用系统集合;

公共(public)类 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 = 角色 Controller GameObject;

m_FollowPosition = true;

m_PositionFollowSpeed = 10;

(其他参数值对本次测试无关紧要)

现在开始场景并移动角色 Controller ,我会看到球体在运动过程中闪烁,但如果你停止移动它会平滑地移动到 Controller 。

最佳答案

您正在使用 FixedUpdate。这样做有什么特别的理由吗?

无论如何,请尝试使用UpdateLateUpdate 而不是FixedUpdate 或检查 中的Fixed Timestep项目设置 => 时间

另请阅读 this question 的答案有关 UpdateFixedUpdate 之间区别的更多信息。

关于c# - 应遵循另一个 GameObject 位置的脚本的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28445725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com