Unity for 2D Platformer中的平滑摄像头跟踪

时间:2018-08-26 02:08:48

标签: unity3d game-development

在过去的两个小时里,我一直在搜寻互联网,以期找到可行的解决方案。我已经尝试了所有可能想到的一切:不同类型的函数,不同类型的更新,不同的平滑时间。以下是有关我的游戏当前播放方式的视频。我正在制作一个仅用于练习的小型平台游戏,并且我希望解决此摄像头问题! Click here for video

这是我当前的代码,但是同样,我也尝试了许多其他组合。感谢您的所有帮助。

using UnityEngine;

public class CameraFollow : MonoBehaviour {

public Transform target;
public Vector3 offset;
public float smoothTime = 0.3f;

private Vector3 velocity;

private void LateUpdate()
{
    transform.position = Vector3.SmoothDamp(transform.position, target.position + offset, ref velocity, smoothTime);
}
}

编辑: 我尝试了很多其他建议,但仍然没有任何效果。如果有帮助,我正在运行Unity 2018.2.5f1 Personal 64位。我正在使用Razer Blade 15 2018。

4 个答案:

答案 0 :(得分:0)

我尚未对此进行测试,但是如果您正确理解了您的问题,那么只要将函数名称从become:更改为aComposite = aLeaf.becomeComposite(); aComposite.addChild(newElement); //destroy aLeaf (bad time performance) ,它应该可以工作。

答案 1 :(得分:0)

您可以尝试下面的代码。这段代码对我的3D游戏有效。

public float translationFactor = 20;

void LateUpdate(){
  if(transform.position != target.position) {
    transform.position += (target.position - transform.position) / translationFactor;           
  }
}

这是直接引用为什么从Unity3D的LateUpdate() documentation开始使用相机时应使用LateUpdate()

  在调用所有Update函数之后,将调用

LateUpdate。这个   对命令脚本执行很有用。例如跟随相机   应该始终在LateUpdate中实现,因为它会跟踪对象   可能已经在Update中移动了。

我还注意到您在 2D 游戏中使用Vector3而不是Vector2。我对2D的了解不如对3D的了解,所以我不知道用Vector3取代Vector2会不会有什么区别。

答案 2 :(得分:0)

我正在考虑您的骨架脚本问题。您的相机跟随骨骼,您正在考虑相机上的问题 尝试使用AddForce而不是transform.position移动骨骼 例子

void Update () {
    if (Input.GetMouseButtonDown (0)) {
        GetComponent<AudioSource> ().PlayOneShot (voices[2]);
        birdSpeed.velocity = Vector2.zero;
        birdSpeed.AddForce (new Vector2 (0, birdUp));
    }
public void Buttons(int i){
    if (i == 0) {
        birds = 0.2f;
        GetComponent<Rigidbody2D> ().gravityScale = 4;
        birdUp = 400;
        StartPanel.SetActive (false);
        GamePanel.SetActive (true);
        GameOverPanel.SetActive (false);
    }

在此代码中,当我单击鼠标悬停时,您可以将代码修改为此

答案 3 :(得分:0)

我知道我迟到了,但是对于问这个问题的所有人,我查看了您的问题并在我正在开发的游戏中对其进行了测试,我通过将 void LateUpdate() 更改为 void FixedUpdate() 来解决您的问题,这里是代码!希望我有所帮助..

using UnityEngine;

    public class CameraFollow : MonoBehaviour {
    
    public Transform target;
    public Vector3 offset;
    public float smoothTime = 0.3f;
    
    private Vector3 velocity;
    
    private void LateUpdate()
    {
        transform.position = Vector3.SmoothDamp(transform.position, target.position + offset, ref velocity, smoothTime);
    }
    }