我是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;
}
}
不幸的是,相机移动不正确。任何想法,如何创建相机窗口?
答案 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);
}
}
}