Сделать, чтобы камера не уходила за тиррейн

Общие вопросы о Unity3D

Сделать, чтобы камера не уходила за тиррейн

Сообщение Niker 14 янв 2022, 18:15

Есть камера которая двигается, когда объект двигается.

Синтаксис:
Используется csharp
public Transform Before, camera;
public static volatile bool IsMove = false;
public Camera cam;
private float Speed = 0f;
private void FixedUpdate() {
    Speed = Rb.velocity.magnitude / 0.5f;
    IsMove = 1 > Speed;
    Camera.position = Vector3.Lerp(Camera.position, Before.position, (Speed <= 0 ? 11 : Speed) * Time.fixedDeltaTime);
}


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

Я пытался сделать так:

Синтаксис:
Используется csharp
if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(1, 0, 0)), cam.farClipPlane, terrainLayer)) {
    camera.position = new Vector3(oldPosition.x, camera.position.y, oldPosition.z);
    print("Right");
} else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(0, 1, 0)), cam.farClipPlane, terrainLayer)) {
    camera.position = new Vector3(oldPosition.x, camera.position.y, oldPosition.z);
    print("Left");
}

Но никак не получается рассчитать верх и низ.
Получается, какая-то дичь (вообще не правильно работает, все равно, засветы какие-то, прыжки по сторонам, не то, что нужно).

Мне нужно, чтобы камера двигалась, только до границ тиррейна.
Как вообще это можно сделать?!
Выручайте уже всю голову сломал.
Весь код:

Синтаксис:
Используется csharp
using System.Collections.Generic;
using UnityEngine;
public sealed class ExplodedObject : MonoBehaviour {
    public static volatile bool IsMove = false;
    public Camera cam;
    public Rigidbody Rb;
    public Transform Before,
                     camera;
    private void FixedUpdate() {
        Speed = Rb.velocity.magnitude / 0.5f;
        IsMove = 1 > Speed;
        Vector3 oldPosition = camera.position;
        camera.position = Vector3.Lerp(camera.position, Before.position, (Speed <= 0 ? 11 : Speed) * Time.fixedDeltaTime);
        int terrainLayer = LayerMask.GetMask("Terrain");
        if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(1, 0, 0)), cam.farClipPlane, terrainLayer)) {
            camera.position = new Vector3(oldPosition.x, camera.position.y, oldPosition.z);
            print("Right");
        } else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(0, 1, 0)), cam.farClipPlane, terrainLayer)) {
            camera.position = new Vector3(oldPosition.x, camera.position.y, oldPosition.z);
            print("Left");
        }
    }
}


Ничего не получается сделать, выручайте пожалуйста знатоки!
Буду весьма признателен и благодарен!

То есть вот такой момент:
Изображение

Чтобы автоматически знала, что дошла до правой, можно значит, вверх и вниз двигать только (точнее вперед, назад), дошли верха, значит только вниз и влево можно двигать, ну в общем я думаю суть вы понимаете.
Niker
UNIт
 
Сообщения: 58
Зарегистрирован: 27 сен 2019, 12:03

Re: Сделать, чтобы камера не уходила за тиррейн

Сообщение 1max1 14 янв 2022, 18:34

Игра 2д? Фиксируй позицию камеры по координатам, зачем рейкасты? Или сними видео, бо я тупой не понимаю ситуёвину твою.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Сделать, чтобы камера не уходила за тиррейн

Сообщение Niker 14 янв 2022, 18:52

3D это, я скрин показал, чтобы видно было, что я хочу сделать.
Камера должна двигаться до границ.
Niker
UNIт
 
Сообщения: 58
Зарегистрирован: 27 сен 2019, 12:03

Re: Сделать, чтобы камера не уходила за тиррейн

Сообщение Niker 15 янв 2022, 08:11

Удалось, решить так:

Синтаксис:
Используется csharp
if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(1, 1, 0)), cam.farClipPlane, terrainLayer)) {
    float x = Сamera.position.x;
    if (x <= oldPosition.x) {
        x = oldPosition.x;
    }
    Сamera.position = new Vector3(x, oldPosition.y, oldPosition.z);
} else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(0, 0, 0)), cam.farClipPlane, terrainLayer)) {
    float x = Сamera.position.x;
    if (x >= oldPosition.x) {
        x = oldPosition.x;
    }
    Сamera.position = new Vector3(x, oldPosition.y, oldPosition.z);
}
if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(1, 0, 0)), cam.farClipPlane, terrainLayer)) {
    Сamera.position = new Vector3(oldPosition.x, oldPosition.y, Сamera.position.z);
} else if (!Physics.Raycast(cam.ViewportPointToRay(new Vector3(0, 1, 0)), cam.farClipPlane, terrainLayer)) {
    Сamera.position = new Vector3(oldPosition.x, oldPosition.y, Сamera.position.z);
}

Только чуть кривовато работает, иногда проявляется засвет за тиррейном, но это иногда, возможно потому что скорость объекта большая черезчур и из за этого прошибает.
А может быть и нет, хз, пока даже не знаю что это.
Но думаю вылечить можно, если поиграть со значениями вектора, чтобы отступить от границы внутрь тиррейна.
Я просто по другому не знаю как это сделать.
Буду рад любой помощи, если есть вариант лучше и надежнее, чтобы камера ходила строго по тиррейну и не куда далее не уходила.
Niker
UNIт
 
Сообщения: 58
Зарегистрирован: 27 сен 2019, 12:03


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5