【问题标题】:Unity 2D - sprite flicker while follow objectUnity 2D - 跟随对象时精灵闪烁
【发布时间】:2015-12-15 19:23:28
【问题描述】:

我正在创建一个简单的脚本,告诉游戏对象它需要在定义的距离内跟随其他游戏对象。

代码:

void Update()
{
    objPos = GameObject.FindGameObjectWithTag("Player").transform.position;
    transform.position = new Vector3(objPos.x + 0.5f, objPos.y + 0.5f);

}

问题是:以下游戏对象闪烁。当您观看它时,它似乎落后于跟随的游戏对象几帧。我之前在我早期的原型中注意到了它,但现在它对我的新游戏至关重要。所以我认为这是很常见的问题。

是否有解决这种不良行为的方法?

谢谢

【问题讨论】:

  • 只是为了好玩,将方法名称更改为LateUpdate() 有什么意义吗?玩游戏的时候有没有开启垂直同步?您应该明确地观察它在 60FPS 时与未锁定时的行为。您确定闪烁与精灵顺序(即图层中的顺序)无关吗?如果它们在同一层上,则会导致可见的闪烁,因为这些对象的 z-Order 会随机变化。在性能方面,修复 objPos 是明智的(例如,将其公开并在检查器中分配),每次搜索可能代价高昂。
  • 您是在寻找真正的“跟随”(意味着速度在方程式中),还是让物体静态始终与玩家物体保持 0.5x.5 的距离?
  • 我之前试过 LateUpdate。同样的结果。更改图层顺序无济于事。单独存储游戏对象也无济于事。
  • 我正在寻找静态距离玩家 0.5 x 5 的游戏对象。 (不是字面上的 0,5,而是仅用于测试目的)
  • 好吧..我相信你可以制作一个预制件,让玩家对象和箭头对象都是它的孩子。然后你应该能够独立于箭头旋转播放器,并且仍然保留箭头的偏移位置。您可以通过预制位置设置精灵位置,但在嵌入式播放器精灵中旋转。希望这是有道理的。

标签: c# unity3d


【解决方案1】:

GameObject.FindGameObjectWithTag("Player") 的性能开销很高,而不是每帧都使用它,而是持有一个玩家的实例。如果玩家在场景中保持不变,

public Transform playerTransform;

void Update()
{
    transform.position = playerTransform.position + new Vector3(0.5f, 0.5f);
}

然后使用检查器将 Unity 编辑器中的 Player 变换分配给该对象。 (或在代码中动态)

如果您的 Player 对象被销毁并且偶尔会实例化一个新对象,您可以将新对象分配给跟随者对象,或者使用如下简单的访问器方法:

Transform _playerTransform;
Transform playerTransform
{
    get
    {
        if(_playerTransform == null)
        {
            _playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
        }
        return _playerTransform;
    }
}

void Update()
{
    transform.position = playerTransform.position + new Vector3(0.5f, 0.5f);
}

【讨论】:

  • 不幸的是我之前尝试过,但事实并非如此 :( 无论如何谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多