如何在Unity3D中创建相机窗口

时间:2015-06-29 20:49:26

标签: unity3d camera

我是Unity的新手,想在这个网站上创建一个相机窗口: http://gamasutra.com/blogs/ItayKeren/20150511/243083/Scroll_Back_The_Theory_and_Practice_of_Cameras_in_SideScrollers.php#h.elfjc4ap4hpe有一个Curb Camera Motion的例子。我想制作一个相机窗口,当玩家撞到窗口边缘时,它会推动相机位置。

任何想法,如何实现这一点?

我使用了这段代码:

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

  public GameObject player;
  public Vector3 min;
  public Vector3 max;

  private Vector3 offset;

  void Start ()
  {
      offset = transform.position - player.transform.position;
  }

  void LateUpdate ()
  {
      Vector3 newPos = player.transform.position + offset;
      newPos.x = Mathf.Clamp(x, min.x, max.x);
      newPos.y = Mathf.Clamp(x, min.y, max.y);
      newPos.z = Mathf.Clamp(x, min.z, max.z);
      transform.position = newPos;
  }
}

不幸的是,相机移动不正确。任何想法,如何创建相机窗口?

3 个答案:

答案 0 :(得分:0)

在将Vector3应用于transform.position

之前将其钳制
  using UnityEngine;
  using System.Collections;

  public class CameraController : MonoBehaviour {

      public GameObject player;
      public Vector3 min;
      public Vector3 max;

      private Vector3 offset;

      void Start ()
      {
          offset = transform.position - player.transform.position;
      }

      void LateUpdate ()
      {
          Vector3 newPos = player.transform.position + offset;
          newPos.x = Mathf.Clamp(x, min.x, max.x);
          newPos.y = Mathf.Clamp(x, min.y, max.y);
          newPos.z = Mathf.Clamp(x, min.z, max.z);
          transform.position = newPos;
      }
  }

答案 1 :(得分:0)

也许不是最好的方法,但你可以在你的相机边缘放置2个对撞机,如果玩家与其中一个碰撞,那么相机将向玩家方向移动。

另一方面,你需要计算cámera位置和玩家位置,这两个位置都是在同一点引用的,例如场景的中心;假设您的相机宽度为10个单位,而玩家为2个单位且两个起始位置均为(0,0)。

因此,我的相机边缘位于(-5,0)& (5,0);而对于我的玩家来说是(-1,0)& (1,0)。然后我需要在每一帧计算我的相机和玩家的位置,以便知道玩家何时到达我的左角或右角。

让我们说玩家向右移动直到他们的位置是(4,0)这意味着他的右角在(5,0)所以,如果距离之间的差异高于此值,我需要开始移动相机一定的价值(在这种情况下为4,因为我们向前走),玩家继续向那个方向移动。

唯一需要注意的是cámera中心和玩家中心之间的距离。如果差异是>到某个数字,如果向后移动则降低,然后移动相机。

基本上是2点之间的距离。

答案 2 :(得分:0)

这里的主要问题是您需要检查屏幕空间中的目标位置。对象在屏幕坐标中的位置。如果目标在“屏幕坐标”中不在窗口中,请移动相机。这里使用的主要功能是

Camera.main.WorldToScreenPoint

以下是一个基本类,应该模仿文章中的效果。这可以改进很多,但应该足以让你开始朝着正确的方向前进。

using UnityEngine;
using System.Collections;

public class CurbCam : MonoBehaviour 
{
    public Transform targetPosition;
    public float camWindowDimension;

    Vector2 targetScreenPos;
    float deltaX;
    float deltaZ;
    // Use this for initialization
    void Start () 
    {

    }

    // Update is called once per frame
    void Update () 
    {
        //convert target pos to 2D
        targetScreenPos = Camera.main.WorldToScreenPoint (targetPosition.position);

        if (targetScreenPos.x > (Screen.width/2) + camWindowDimension) 
        {
            deltaX = targetScreenPos.x - ((Screen.width/2) + camWindowDimension);
            transform.position = new Vector3(transform.position.x + deltaX, transform.position.y, transform.position.z);
        }

        if (targetScreenPos.x < (Screen.width/2) - camWindowDimension) 
        {
            deltaX = targetScreenPos.x - ((Screen.width/2) - camWindowDimension);
            transform.position = new Vector3(transform.position.x + deltaX, transform.position.y, transform.position.z);
        }

        if (targetScreenPos.y > (Screen.height/2) + camWindowDimension) 
        {
            deltaZ = targetScreenPos.y - ((Screen.height/2) + camWindowDimension);
            transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z + deltaZ);
        }

        if (targetScreenPos.y < (Screen.height/2) - camWindowDimension) 
        {
            deltaZ = targetScreenPos.y - ((Screen.height/2) - camWindowDimension);
            transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z + deltaZ);
        }

    }
}