c# - 为 Unity3D 构建一个正交相机,我怎样才能让四个特定目标保持在视线范围内?

标签 c# android ios unity3d

我有一个 2D 正交相机,用于类似于网球的游戏。我一直在为此编写代码,我想我只是到目前为止的一部分。目前……它……有点让两个玩家保持在画面中,画面更朝向人类玩家——玩家一号。然而,它也有下降到地面以下的趋势 - 特别是当它缩小以保持目标可见时。有四个特定目标:地面、球、球员一和球员二。

地面应始终位于“底部”,否则当相机进入地面下方时会显示天空 - 这并不是一个理想的效果。这是我到目前为止开发的代码......这两个玩家实际上是桨,但它只显示了他们之间的中心:

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

    // Moving Camera, This Camera tries to follow Player One, Two, and Ball //

public static CameraController Instance;
public Transform PlayerOne;
public Transform PlayerTwo;
public Transform Ball;

public bool Ready = false;

private float MinX = -46.0f;
private float MaxX = 46.0f;

private float MinY = 12.0f;
private float MaxY = 35.0f;

private float LimitFromPlayerX = 20.0f;
private float LimitFromPlayery = 20.0f;

private float DistanceToGround = 0.0f;
private float DistanceFromCenter = 2.0f;

private float Height = 4.0f;

private float Damping = 5f;

private Vector3 EstimatedCameraPosition = Vector3.zero;
private Vector3 WantedPosition = Vector3.zero;

void Awake()
{
    Instance = this;

}

public void SetCameraPosition()
{
    Vector3 PlayerPosistion = PlayerOne.position;

    PlayerPosistion.z = -10.10f;

    transform.position = PlayerPosistion;
}

// Update is called once per frame
void FixedUpdate () {
    if (Ready) {
        Vector3 PlayerPosistion = PlayerOne.position;

        PlayerPosistion.z = -10.10f;

        Vector3 CameraPosition = transform.position;

        CameraPosition.z = -10.10f;

        // Get the Distance from the Player to the Ball //
        Vector3 WantedPosition = PlayerTwo.transform.position - -PlayerOne.transform.position;

        float WPMag = Mathf.Abs(WantedPosition.magnitude);

        WPMag = Mathf.Clamp(WPMag, 20, 40);

        Debug.Log(WPMag);

        Camera.main.orthographicSize = WPMag;

        transform.position = Vector3.Lerp(CameraPosition, WantedPosition, Damping * Time.deltaTime);
    }
}

void LateUpdate()
{
    Vector3 Posit = transform.position;
    Posit.x = Mathf.Clamp (Posit.x, MinX, MaxX);
    Posit.y = Mathf.Clamp (Posit.y, MinY, MaxY);

    transform.position = Posit;
}

WPMag 是我尝试缩小并至少匹配玩家的尝试,但到目前为止它只是部分奏效。

最佳答案

要让所有三个对象都在视野中,您需要将相机聚焦在三个对象的中点或“平均”位置。获取三个对象的中点就像获取两个对象的中点一样:(PlayerOne.position + PlayerTwo.position + Ball.position)/3.0f

然后您需要将正交大小设置为距离三个被跟踪对象的中点最远的距离。这将确保所有三个对象都留在框架中。

最后,为了防止相机显示地下天空,您应该为相机的 Y 位置强制执行一个下限。正交大小是视口(viewport)垂直高度的一半,因此您可以使用 CameraPosition.y = Mathf.Max(CameraPosition.y, groundHeight + camera.main.orthographicSize)

关于c# - 为 Unity3D 构建一个正交相机,我怎样才能让四个特定目标保持在视线范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26834154/

相关文章:

android - BadgeDrawable 是否不适用于 FrameLayout 中的 View ,例如按钮、图像、 TextView 等?

java - 如何在一个 Activity 中将 addOnScrollListener 与不同的列表一起使用

iphone - 在 iPhone 应用程序中以编程方式创建富文本文件

ios - 如何一次加载同一 3D 模型的多个节点?

android - 在代号中,一个组合框文本被截断

c# - Azure AD 联合注销未重定向到客户端应用程序

c# - 加载附在一个缩略图上的多张图像

C# 表单对于 2D 游戏来说太慢了吗?

java - Android 共享 Intent - 某些文件不会共享

c# - 将数据库嵌入到 C#/VB.net 中的应用程序