Динамическая Палата с Unity2D

Я хочу сделать такой оператор как, например, камера игр Hotline Майами или Ядерный Throne; динамическая камера, которая следует за игроком оставляя это в центральной зоне экрана.

Восток - руководитель, который объясняет, как делать это. У меня есть код, который может служить, но камера представляет проблемы положения, и если я двигаю игрока, камера скроллирует больше счета.

Здесь - код:

using UnityEngine;
using System.Collections;

public class shauldspading : MonoBehaviour
{
    public Transform Player;
    public Transform Mouse;

    // Use this for initialization
    void Start ()
    {

    }

    // Update is called once per frame
    void FixedUpdate ()
    {
        //var mousePos = Input.mousePosition;
        //Vector3 Mouse = Camera.main.ScreenToWorldPoint(mousePos);

        float xTo, yTo;
        Vector3 pos = transform.position;
        xTo = Player.position.x + lengthdir_x(Mathf.Min(9,Vector3.Distance(Player.transform.position, Mouse.transform.position)), Mouse.position);
        yTo = Player.position.y + lengthdir_y(Mathf.Min (9, Vector3.Distance (Player.transform.position, Mouse.transform.position)), Mouse.position);
        pos.x += (xTo - pos.x) / 25;
        pos.y += (yTo - pos.y) / 25;
        transform.position = pos;
    }

    float lengthdir_x(float len, Vector3 dir)
    {
        dir = dir.normalized * len;
        return dir.x;
    }

    float lengthdir_y(float len, Vector3 dir)
    {
        dir = dir.normalized * len;
        return dir.y;
    }
}

Уже я протестировал код и оно я функционирует, но у него есть недостаток, которого он не установлен, и если я двигаюсь, представь проблемы положения.

Что было бы должно делать, чтобы решать эту проблему и улучшать код, который наверху?

Обновление: Динамическая Ядерная видеокамера Throne пример динамической камеры 2D.

4
задан 03.01.2016, 23:31
3 ответа

scritp авторство kaito

функционирует гениально.

using UnityEngine;

using System.Collections;

//El script se añade a la camara
[RequireComponent(typeof(Camera))]

public class script3 : MonoBehaviour {

    public Transform target; //Gameobject que hace de pivot
    public float smoothTime = 0.5f; //tiempo smooth
    public Vector2 desplazamiento = new Vector2(3f, 2f); //desplazamiento de origen
    public Vector2 resolucion = new Vector2(800f,600f); //resolucion de origen


    Vector3 velocity = Vector3.zero; //velocidad smooth
    Vector3 centerScreen; //centro pantalla
    Vector3 aspect; //aspecto ratio


    void Start() {


        if(this.target == null){

            Destroy(this);
            Debug.Log("Asignar Target en script3 - " + this.name);
            Debug.Break();
            return;

        }

        this.centerScreen = new Vector3(Screen.width * 0.5f, Screen.height * 0.5f, 0f);
        //Recalcular desplazamiento en relacion a pantalla actual
        this.desplazamiento = new Vector2(this.desplazamiento.x * Screen.width / this.resolucion.x,
                                          this.desplazamiento.y * Screen.height / this.resolucion.y);
        this.aspect = new Vector3(this.desplazamiento.x / Screen.width, this.desplazamiento.y / Screen.height, 0f);

    }

    void Update () {

        Vector3 temp = this.target.position + Vector3.Scale(Input.mousePosition - this.centerScreen, this.aspect);
        this.transform.position = Vector3.SmoothDamp(this.transform.position, temp, ref this.velocity, this.smoothTime);

    }

}
1
ответ дан 24.11.2019, 15:02

Давно он реализовал что-то сходное, в самом деле это относительно просто.

Я оставляю тебе ссылку в код, который я использовал для одной из моих игр:

https://github.com/moscoquera/Cubos/blob/master/Assets/Scripts/Camara_seguirObjeto.cs

Этот рукописный шрифт должен быть добавленным к камере к вопросу, и в "цели" нужно снабжать ссылками игрока в карте.

2
ответ дан 24.11.2019, 15:02
  • 1
    C и # 243; я говорю гениальную, но движение ее c и # 225; толпа должна быть относительно posici и # 243; n мыши и объекта, который он нужно продолжать, я объясняю себе, если мышь двигает вниз экрана ее c и # 225; толпа, она c и # 225; толпа двигается вниз, но относительно объекта, который нужно продолжать, но не теряя его вида, но если объект, который нужно продолжать, двигает ее c и # 225; толпа просто продолжает их как в этом v и # 237; deo: [ youtube.com/watch?v=1FhB1w_7Qp0&feature=youtu.be] –  NessMastert_Ration 30.12.2015, 01:32
  • 2
    @NessMastert_Ration Вы должны обновлять Ваш вопрос с этим соединением v и # 237; deo. –  DuckMaestro 31.12.2015, 08:26

Я увидел видео "Ядерного Throne", которое ты добавил к секции комментариев. Мой ответ на этом поведении.

Сначала, определите насколько далеко камеру возможно двигать относительно положения игрока, из-за примеров в pixels. Например, если экран - 800x600, и ты позволяешь, чтобы камера смогла двигаться без дистанции половины экрана, тогда, пределы - +/-300 вертикально и +/-400 горизонтально.

Секунда, в любом моменте ты можешь знать / консультироваться во все pixels мышь будь центра экрана. Обратите результат в [-1... +1] используя пределы, которые Вы определили ранее. Например, если мышь - в ( 253 ; 402 ), этот будет преобразован в ( -0,37 ; 0,34 ). Если любое число больше, чем +1,0 или меньше, чем -1,0, сделай "clamp" в +1,0 или -1,0.

В конце концов, умножать coordinates преобразованные пределами движения, и добавьте это с положением игрока в мире. Например, если игрок - в ( 8042 ; -5732 ), центр камеры должен класться в:

( 8042 ; -5732 ) + ( -0,37 * 400 ; 0,34 * 300 ) = ( 7894 ; -5630 )

или концептуально:

( pos. del jugador ) + ( mitad del res. de pant. ) * ( pos. del mouse en la pant. ) 
    = ( pos. de cam. final )

Я надеюсь, что это помогает ему.

0
ответ дан 24.11.2019, 15:02