当相机移动时,场景中除了玩家之外的所有东西看起来都很模糊 | Unity2D
Everything in the scene except the player looks blurry when the camera is moving | Unity2D
我使用一个简单的相机跟随脚本开始我的游戏,该脚本仅在 x 轴上跟随我的玩家并带有偏移和一些限制
我在 android 上录制了一段视频来展示我的意思。在录音中,这个问题有点夸张(由于录音),只有尖峰进入视野后才能看到。不录制时,播放器动画非常流畅。 Here's the video
using UnityEngine;
public class MainCamera : MonoBehaviour {
public Transform target;
public float xOffset, xPosRestrictionMin, xPosRestrictionMax;
private float yPos, zPos;
void Start ()
{
yPos = transform.position.y;
zPos = transform.position.z;
}
void LateUpdate ()
{
transform.position = new Vector3(Mathf.Clamp(target.position.x + xOffset, xPosRestrictionMin, xPosRestrictionMax), yPos, zPos);
}
}
然而,当第一个 运行 游戏时,一切看起来 "jittery"。尽管我所有的玩家物理都在固定更新内,输入在更新内,相机更新在 lateupdate 内。我尝试设置插值以推断玩家 rigidbody2d。现在播放器的外观和动画效果会很流畅,但当摄像机移动时,其他一切看起来都很模糊。我认为可能是我的脚本或设置有问题,所以我尝试关闭垂直同步,将目标帧速率设置为 60,当没有任何效果时,我下载了 Cinemachine。即使使用 Cinemachine 而不是我自己的脚本,它仍然看起来很模糊,我不明白为什么。这是我的控件的简化版本。
private void Update()
{
//Handle touch input
if (Input.touchCount > 0)
{
foreach (Touch touch in Input.touches)
{
switch (touch.phase)
{
// Touchdown
case TouchPhase.Began:
if (onGround || !doubleJumped)
{
jump = true;
touchReleased = false;
if (onGround)
anim.SetBool("jump", true);
}
break;
//Touch up
case TouchPhase.Ended:
allowGlide = false;
anim.SetBool("glide", false);
if (rb.velocity.y > 0)
touchReleased = true;
break;
}
}
}
}
void FixedUpdate()
{
rb.velocity = new Vector2(newMoveSpeed, rb.velocity.y);
onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround);
if (onGround && !jump)
{
gliding = false;
allowGlide = false;
anim.SetBool("glide", false);
anim.SetBool("jump", false);
doubleJumped = false;
}
//Slowly Accelerate if not at top speed and touching the ground
if (newMoveSpeed < moveSpeed && onGround)
newMoveSpeed += 0.0165f;
anim.speed = Mathf.Clamp(newMoveSpeed, 13, 18);
//Jumping
if (jump && onGround)
{
jump = false;
rb.velocity = new Vector2(rb.velocity.x, jumpHeight);
}
else if (jump && !doubleJumped && !onGround)
{
jump = false;
doubleJumped = true;
allowGlide = true;
rb.velocity = new Vector2(rb.velocity.x, jumpHeight);
}
//Add multiplier if falling down
if (rb.velocity.y < 0 && allowGlide)
{
anim.SetBool("glide", true);
if (!gliding)
{
rb.velocity -= Vector2.up * Physics2D.gravity.y;
gliding = true;
}
else
{
rb.velocity += Vector2.up * Physics2D.gravity.y * (glideMultiplier - 1) * Time.deltaTime;
}
}
else if (rb.velocity.y < 0)
{
rb.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
}
//Increase fall multiplier if touch is released mid jump
else if (rb.velocity.y > 0 && touchReleased)
{
rb.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
}
else if (rb.velocity.y == 0)
{
return;
}
}
谢谢,如有任何帮助或反馈,我们将不胜感激!
您是否检查过您的游戏 运行 在设备上的帧率?我有 film/animation 背景(但对 Unity 是新手),在我看来你遇到了帧速率问题。虽然,如果录制软件完全改变了图形,我不确定我看到的是不是和你一样。为什么你的录音软件会那样做?您是否尝试过使用 Rec?对我来说效果很好。
抱歉没有将此作为评论发布 - 我当前的代表不允许我这样做。
也许我认为这导致设备中的录音出现问题,这可能占用了一些计算能力并导致了问题,同样的事情是否在播放而不是录音时发生?
我使用一个简单的相机跟随脚本开始我的游戏,该脚本仅在 x 轴上跟随我的玩家并带有偏移和一些限制
我在 android 上录制了一段视频来展示我的意思。在录音中,这个问题有点夸张(由于录音),只有尖峰进入视野后才能看到。不录制时,播放器动画非常流畅。 Here's the video
using UnityEngine;
public class MainCamera : MonoBehaviour {
public Transform target;
public float xOffset, xPosRestrictionMin, xPosRestrictionMax;
private float yPos, zPos;
void Start ()
{
yPos = transform.position.y;
zPos = transform.position.z;
}
void LateUpdate ()
{
transform.position = new Vector3(Mathf.Clamp(target.position.x + xOffset, xPosRestrictionMin, xPosRestrictionMax), yPos, zPos);
}
}
然而,当第一个 运行 游戏时,一切看起来 "jittery"。尽管我所有的玩家物理都在固定更新内,输入在更新内,相机更新在 lateupdate 内。我尝试设置插值以推断玩家 rigidbody2d。现在播放器的外观和动画效果会很流畅,但当摄像机移动时,其他一切看起来都很模糊。我认为可能是我的脚本或设置有问题,所以我尝试关闭垂直同步,将目标帧速率设置为 60,当没有任何效果时,我下载了 Cinemachine。即使使用 Cinemachine 而不是我自己的脚本,它仍然看起来很模糊,我不明白为什么。这是我的控件的简化版本。
private void Update()
{
//Handle touch input
if (Input.touchCount > 0)
{
foreach (Touch touch in Input.touches)
{
switch (touch.phase)
{
// Touchdown
case TouchPhase.Began:
if (onGround || !doubleJumped)
{
jump = true;
touchReleased = false;
if (onGround)
anim.SetBool("jump", true);
}
break;
//Touch up
case TouchPhase.Ended:
allowGlide = false;
anim.SetBool("glide", false);
if (rb.velocity.y > 0)
touchReleased = true;
break;
}
}
}
}
void FixedUpdate()
{
rb.velocity = new Vector2(newMoveSpeed, rb.velocity.y);
onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, whatIsGround);
if (onGround && !jump)
{
gliding = false;
allowGlide = false;
anim.SetBool("glide", false);
anim.SetBool("jump", false);
doubleJumped = false;
}
//Slowly Accelerate if not at top speed and touching the ground
if (newMoveSpeed < moveSpeed && onGround)
newMoveSpeed += 0.0165f;
anim.speed = Mathf.Clamp(newMoveSpeed, 13, 18);
//Jumping
if (jump && onGround)
{
jump = false;
rb.velocity = new Vector2(rb.velocity.x, jumpHeight);
}
else if (jump && !doubleJumped && !onGround)
{
jump = false;
doubleJumped = true;
allowGlide = true;
rb.velocity = new Vector2(rb.velocity.x, jumpHeight);
}
//Add multiplier if falling down
if (rb.velocity.y < 0 && allowGlide)
{
anim.SetBool("glide", true);
if (!gliding)
{
rb.velocity -= Vector2.up * Physics2D.gravity.y;
gliding = true;
}
else
{
rb.velocity += Vector2.up * Physics2D.gravity.y * (glideMultiplier - 1) * Time.deltaTime;
}
}
else if (rb.velocity.y < 0)
{
rb.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
}
//Increase fall multiplier if touch is released mid jump
else if (rb.velocity.y > 0 && touchReleased)
{
rb.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
}
else if (rb.velocity.y == 0)
{
return;
}
}
谢谢,如有任何帮助或反馈,我们将不胜感激!
您是否检查过您的游戏 运行 在设备上的帧率?我有 film/animation 背景(但对 Unity 是新手),在我看来你遇到了帧速率问题。虽然,如果录制软件完全改变了图形,我不确定我看到的是不是和你一样。为什么你的录音软件会那样做?您是否尝试过使用 Rec?对我来说效果很好。
抱歉没有将此作为评论发布 - 我当前的代表不允许我这样做。
也许我认为这导致设备中的录音出现问题,这可能占用了一些计算能力并导致了问题,同样的事情是否在播放而不是录音时发生?