Nano Hash - криптовалюты, майнинг, программирование

Создавая ортогональную камеру для Unity3D, как я могу держать в поле зрения четыре определенные цели?

У меня есть двухмерная ортогональная камера для игры, построенной так же, как и в теннисе. Я работал над кодом для этого и думаю, что пока я только часть пути. На данный момент ... это ... как бы удерживает двух игроков в кадре, причем кадр ведет больше к игроку-человеку - Первому игроку. Тем не менее, он также имеет тенденцию опускаться ниже уровня земли - особенно когда он приближается, чтобы держать цели в поле зрения. Есть четыре конкретных цели: Земля, Мяч, Первый игрок и Второй игрок.

Земля всегда должна быть внизу, иначе, когда камера опускается под землю, она показывает небо - не совсем желательный эффект. Это код, который я разработал до сих пор ... два игрока эффективно играют, но он показывает только центр между ними:

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 был моей попыткой уменьшить масштаб и, по крайней мере, сопоставить игроков, но пока это работает только частично.

09.11.2014

Ответы:


1

Чтобы все три объекта были в поле зрения, вам нужно сфокусировать камеру на средней точке или «среднем» положении трех объектов. Получение середины трех объектов работает так же, как получение середины двух объектов: (PlayerOne.position + PlayerTwo.position + Ball.position) / 3.0f

Затем вы захотите установить ортогональный размер на наибольшее расстояние от середины трех отслеживаемых объектов. Это гарантирует, что все три объекта останутся в кадре.

Наконец, чтобы камера не показывала подземное небо, вы должны установить нижний предел для положения камеры по оси Y. Орфографический размер составляет половину вертикальной высоты области просмотра, поэтому вы должны использовать CameraPosition.y = Mathf.Max(CameraPosition.y, groundHeight + camera.main.orthographicSize)

10.11.2014
  • Спасибо! Я действительно добился того, чтобы это сработало, как вы предложили, но эффект не сработал так хорошо, как я надеялся. 11.11.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..