如何在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);
}
}
}
我是 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);
}
}
}