如何在Unity3D中创建摄影机窗口

如何在Unity3D中创建摄影机窗口,unity3d,camera,Unity3d,Camera,我是Unity的新手,希望在这个网站上创建一个摄像头窗口: 有一个包含路边摄影机运动的示例。我想制作一个相机窗口,当玩家点击窗口边缘时,它会推动相机的位置 有什么想法,如何实现这一点 我使用了以下代码: using UnityEngine; using System.Collections; public class CameraController : MonoBehaviour { public GameObject player; public Vector3 min; p

我是Unity的新手,希望在这个网站上创建一个摄像头窗口: 有一个包含路边摄影机运动的示例。我想制作一个相机窗口,当玩家点击窗口边缘时,它会推动相机的位置

有什么想法,如何实现这一点

我使用了以下代码:

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
应用于
变换。位置

  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
,然后将其应用于
变换。位置

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

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

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

    }
}
换句话说,你需要计算卡梅拉的位置和球员的位置,这两个位置都是在同一点上引用的,比如你场景的中心;假设您的相机宽度为10个单位,播放器为2个单位,两个起始位置均为(0,0)

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

假设玩家向右移动,直到他们的位置为(4,0),这意味着他的右角位于(5,0),因此,如果距离差大于某个值(在本例中为4,因为我们向前走),并且玩家继续朝该方向移动,我需要开始移动相机

唯一需要注意的是cámera中心和球员中心之间的距离。如果差值>到某个数字,或者如果向后移动,则差值更小,则只需移动相机即可


基本上是两个点之间的距离。

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

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

    }
}
换句话说,你需要计算卡梅拉的位置和球员的位置,这两个位置都是在同一点上引用的,比如你场景的中心;假设您的相机宽度为10个单位,播放器为2个单位,两个起始位置均为(0,0)

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

假设玩家向右移动,直到他们的位置为(4,0),这意味着他的右角位于(5,0),因此,如果距离差大于某个值(在本例中为4,因为我们向前走),并且玩家继续朝该方向移动,我需要开始移动相机

唯一需要注意的是cámera中心和球员中心之间的距离。如果差值>到某个数字,或者如果向后移动,则差值更小,则只需移动相机即可


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

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

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

    }
}
使用UnityEngine;
使用系统集合;
公共阶层:单一行为
{
公共转型目标定位;
公共浮动维度;
Vector2目标屏幕位置;
浮动税收;
浮动三角洲;
//用于初始化
无效开始()
{
}
//每帧调用一次更新
无效更新()
{
//将目标位置转换为二维
targetScreenPos=Camera.main.WorldToScreenPoint(targetPosition.position);
如果(targetScreenPos.x>(屏幕宽度/2)+camWindowDimension)
{
deltaX=目标屏幕位置x-((屏幕宽度/2)+camWindowDimension);
transform.position=新矢量3(transform.position.x+deltaX,transform.position.y,transform.position.z);
}
如果(目标屏幕位置x<(屏幕宽度/2)-凸轮窗口尺寸)
{
deltaX=目标屏幕位置x-((屏幕宽度/2)-camWindowDimension);
transform.position=新矢量3(transform.position.x+deltaX,transform.position.y,transform.position.z);
}
如果(目标屏幕位置y>(屏幕高度/2)+凸轮窗口尺寸)
{
deltaZ=目标屏幕位置y-((屏幕高度/2)+凸轮窗口尺寸);
transform.position=新矢量3(transform.position.x,transform.position.y,transform.position.z+deltaZ);
}
如果(目标屏幕位置y<(屏幕高度/2)-凸轮窗口尺寸)
{
deltaZ=目标屏幕位置y-((屏幕高度/2)-凸轮窗口尺寸);
transform.position=新矢量3(transform.position.x,transform.position.y,transform.position.z+deltaZ);
}
}
}

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

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

    }
}
使用UnityEngine;
使用系统集合;
公共阶层:单一行为
{
公共转型目标定位;
公共浮动维度;
Vector2目标屏幕位置;
浮动税收;
浮动三角洲;
//用于初始化
美国之音