如何在Unity3D中创建相机-window

How to create a camera-window in Unity3D

我是 Unity 的新手,想创建一个相机-window 就像在这个网站上一样: http://gamasutra.com/blogs/ItayKeren/20150511/243083/Scroll_Back_The_Theory_and_Practice_of_Cameras_in_SideScrollers.php#h.elfjc4ap4hpe 有一个 Curb Camera Motion 示例。我想制作一个 camera-window,它会在玩家击中 window 边缘时推动相机位置。

任何想法,如何实现这个?

我使用了这个代码:

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;
  }
}

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

先将 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;
      }
  }

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

换句话说,您需要计算摄像机位置和玩家位置,它们都参考了同一点,例如场景的中心;可以说你的相机宽度是 10 个单位,玩家是 2 个单位,两个起始位置都在 (0,0)。

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

假设玩家向右移动直到他们的位置是 (4,0) 这意味着他的右角在 (5,0) 所以,如果距离之间的差异是高于某个值(在本例中为 4,因为我们正在向前走)并且玩家继续朝那个方向移动。

唯一需要注意的是摄像机中心和玩家中心之间的距离。如果差异 > 到某个数字,或者如果你向后移动则更低,那么只需移动相机。

基本上就是2个点之间的距离

这里的主要问题是您需要检查您的目标在屏幕中的位置 space。对象在屏幕坐标中的位置。如果目标不在 "screen coordinates" 中的 window 范围内,则移动你的相机。这里要用到的主要函数是

Camera.main.WorldToScreenPoint

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

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);
        }

    }
}