- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前制作的脚本有点问题。基本上,我想创建一个脚本,使其成为游戏对象(我们将其命名为 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
。这样做有什么特别的理由吗?
无论如何,请尝试使用Update
或LateUpdate
而不是FixedUpdate
或检查 中的
。 Fixed Timestep
项目设置 => 时间
另请阅读 this question 的答案有关 Update
和 FixedUpdate
之间区别的更多信息。
关于c# - 应遵循另一个 GameObject 位置的脚本的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28445725/
我对在编写 Unity 脚本时继承自 MonoBehaviour 的 gameObject 的使用有疑问。 在一些教程中,例如制作缩放的健康条,我们检索健康条的原始比例如下: originalScal
我有一个名为 trigger 的无敌 GameObject,当我的 Hero 与它碰撞时,一盏枝形吊灯会掉落。我想给枝形吊灯一个 Rigidbody,这样它就会掉落,您可以与它碰撞并使用它。 如果你能
我正在使用 Unity 开发一款游戏,其中所有带有特定标签的 Gameobjects 都会相当规律地消失/重新出现(平均每 10 秒一次)。我使用 GameObject.FindGameObjects
public void FindClosestEnemy() { List pList = GameObject.FindGameObjectsWithTag("Player");
我有两个像这样的 GameObject: public class GOA : MonoBehaviour { void Start() { ... do something
概览 考虑一个简单的硬币收集游戏。有两个脚本,CollectableItem 和 ItemVault。 CollectableItem 有一个 value 属性,它告诉项目的值(value),它被添加
我试图找出我的游戏对象正在被我的游戏中的哪个脚本破坏。 到目前为止,我尝试打印堆栈,但那里没有提到销毁游戏对象的脚本的详细信息 代码:Debug.Log(UnityEngine.StackTraceU
在 Unity3D 序列化 GameObject 之前是否有任何回调(或任何其他方式)通知? 我需要类似于 OnSerializeNetworkView 的东西但对于常规 GameObject。 有用
我正在使用 Unity 制作游戏。我在随机位置实例化 (circle) GameObjects 并且效果很好。我想要做的是仅在不会与其他 GameObjects 重叠的位置实例化。我在互联网上找到的解
我遇到了一个小问题。 我制作了一个 3D 立方体并设置了 GoogleVR SDK,以便在 VR 屏幕的中点进入立方体时使用事件触发器。发生这种情况时,将触发我的自定义方法 LookAtCube()。
我想获取某个文件夹中的所有预制件,然后将其转换为列表 我的代码: this.list = (List) (Resources.LoadAll("items")).ToList(); // this c
所以我的游戏世界中有三个不同的“旁观者”,每个都有一个附加的“旁观者”脚本,并且我的 UI 中有一个“旁观者对话”元素。这个想法是,当玩家进入任何旁观者的范围时,会显示从数据库中随机选择的文本,但对于
我正在编写我的游戏 Boss 行为代码,在战斗的最后阶段,Boss 应该向玩家冲锋,然后回到原来的位置。等待 5 秒,然后执行相同的操作。 我尝试使用协同程序和 Vector2.MoveTowards
总结如下:我想从 OnTriggerEnter2D 事件中找到参与碰撞的两个对撞机。我该怎么做? 我有两个游戏对象。两者都有一个碰撞器和一个触发器。 在对象 A 上,它被触发器包围。在对象 B 上,触
我目前有一个脚本应该实例化一个粒子系统并在一定时间后销毁它,但是在实例化对象之后,出现此错误代码: MissingReferenceException: The object of type 'Par
我目前有一个脚本应该实例化一个粒子系统并在一定时间后销毁它,但是在实例化对象之后,出现此错误代码: MissingReferenceException: The object of type 'Par
Unity 对象不在中心旋转。直到一个小时都很好,我不相信我更改了代码或任何东西。我也试过弄乱左上角的枢轴/中心按钮,但没有任何帮助。游戏对象没有在中间旋转。 旋转器代码: using UnityEn
我很难将一些游戏对象链接在一起以“跟随领导者”。 这就是我想要完成的: 有“头”对象的地方,它会拉动 body 对象。像蛇或蜈蚣。 然而,这是正在发生的事情: 它们都有点跟随头部,但它们似乎作为一个整
假设我的脚本定义如下。 public GameObject _GameObject; private void Start() { [![enter image description here][1
所以基本上我是在尝试将一群 child 添加到游戏对象中。父游戏对象称为 SnakeHead,而所有其他游戏对象称为 SnakeBodyParts public class GameControlle
我是一名优秀的程序员,十分优秀!