移动精灵身体会导致抖动
本文关键字:抖动 体会 精灵 移动 | 更新日期: 2024-10-29 15:09:37
我对 Unity 开发相当陌生。我想找出为什么当我移动精灵对象时,它会导致非常明显的抖动。我在互联网上读过一些安静的答案,有人说关于刚性车身2d的事情,一些关于固定或延迟更新等。但我的问题似乎并没有被这些解决。我只有一个精灵对象,没有刚体,只有一个带有精灵渲染器组件的游戏对象,并在一个包含摄像机的空项目中附加了一个脚本。这是我正在使用的整个脚本,您只需将粘贴复制到名为MoveBackground的cs文件中即可。
using UnityEngine;
using System.Collections;
public class MoveBackground : MonoBehaviour {
Vector3 pointA;
Vector3 pointB;
float timeRequired;
public float speed = 5;
IEnumerator movingEnum;
float belowEdge;
// Use this for initialization
void Start () {
Camera cam = Camera.main;
float height = 2f * cam.orthographicSize;
belowEdge = cam.transform.position.y - height/2f;
movingEnum = StartMoving ();
initializeAndMoveObject ();
}
// Update is called once per frame
void Update () {
// transform.Translate(0, (-1*speed * Time.deltaTime) / 100, 0);
//this.gameObject.transform.Translate (0f , Time.deltaTime * speed,0f);
}
void MoveToNextPosition()
{
float distance = Mathf.Abs( Mathf.Sqrt (Mathf.Pow ((pointA.x - pointB.x), 2f) + Mathf.Pow ((pointA.y - pointB.y), 2f)));
float time = distance/speed;
timeRequired = time;
movingEnum.MoveNext ();
}
IEnumerator StartMoving()
{
while (true) {
yield return StartCoroutine(MoveObject(transform, pointA, pointB, timeRequired));
}
}
IEnumerator MoveObject(Transform thisTransform, Vector3 startPos, Vector3 endPos, float time)
{
var i= 0.0f;
var rate= 1.0f/time;
while (i < 1.0f) {
i += Time.deltaTime * rate;
thisTransform.position = Vector3.Lerp(startPos, endPos, i);
yield return null;
}
}
public void initializeAndMoveObject()
{
Vector3 moveTowardsPoint;
SpriteRenderer sR = GetComponent<SpriteRenderer> ();
Vector3 bounds = sR.bounds.extents;
float height = bounds.y * 2f;
moveTowardsPoint = transform.position;
moveTowardsPoint.y = belowEdge - height / 2f;
pointA = transform.position;
pointB = moveTowardsPoint;
MoveToNextPosition ();
}
}
此脚本从上到下移动对象。另外,当我在编辑器中的计算机上运行它时,我没有抖动。但是当我在设备(iPhone6 +)上运行它时,它会导致非常非常大的烦人抖动,具体取决于它向下移动的速度。
这不是我尝试使对象移动的唯一方法,我尝试使用
transform.Translate(0, (-1*speed * Time.deltaTime) / 100, 0);
在更新和修复更新中无济于事。我尝试使用Quad来实现此目的。(我的游戏对象基本上是一个向下移动的 Bg)。四元脚本的代码段是
public float speed = -0.5f;
private Vector2 savedOffset;
void Start () {
savedOffset = renderer.sharedMaterial.GetTextureOffset ("_MainTex");
}
void Update () {
float y = Mathf.Repeat ((Time.time * speed), 1);
Vector2 offset = new Vector2 (savedOffset.x, y);
renderer.sharedMaterial.SetTextureOffset ("_MainTex", offset);
}
void OnDisable () {
renderer.sharedMaterial.SetTextureOffset ("_MainTex", savedOffset);
}
如果有人能指导我,我将非常感谢你。
这个问题是通过将 iPhone+ 代码中的 targetFrameRate 设置为 60 来解决的(设置 30 不起作用,设置 -1 不起作用),任何高于 60 的值也可以工作,但低于 60 会导致抖动。所以我所做的只是,一旦我的应用程序启动,我必须执行此语句(代码中的任何位置都可以工作,但最好是 Awake,在我的场景中它不必在 Awake 中)。
Application.targetFrameRate = 60;
Unity 文档参考 : http://docs.unity3d.com/ScriptReference/Application-targetFrameRate.html
附带说明一下,并非所有设备都需要 60 帧速率。