Как сделать чтобы камера двигалась за игроком unity
Перейти к содержимому

Как сделать чтобы камера двигалась за игроком unity

  • автор:

(Unity)Как заставить правильно двигаться камеру за игроком

Создаю «кенши»подобную игру, хочу, чтобы когда игрок зажимал колёсико и двигал мышь влево вправо, камера двигалась вокруг персонажа, при этом мой скрипт на передвижение делает, чтобы камера всегда смотрела ему в зад , из-за этого, если я присоединяю камеру к объекту прокрутка не работает. Что можно с этим сделать? Вот скрипт на перемещение

public class MovementScript : MonoBehaviour < public LayerMask ClickedTargetLayer; private NavMeshAgent MyAgent; public GameObject Player; public static bool Taked = false; private void Start() < MyAgent = GetComponent(); > private void Update() < if(Taked == true) < Camera.main.transform.parent = Player.transform; if (Input.GetMouseButtonDown(0)) < Camera.main.transform.parent = Player.transform; Ray MyRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitinfo; if (Physics.Raycast(MyRay, out hitinfo, 200, ClickedTargetLayer)) < MyAgent.SetDestination(hitinfo.point); >> > > > 

Вот место, где происходит разворот колёсиком. Опять же привязать камеру к объекту не вариант.

 if (Input.GetMouseButton(2) && MovementScript.Taked != false) < if (Input.mousePosition.x >lastMouseX) < Capsule.transform.Rotate(0, -150 * Time.deltaTime, 0); >else if (Input.mousePosition.x < lastMouseX) < Capsule.transform.Rotate(0, 150 * Time.deltaTime, 0); >lastMouseX = Input.mousePosition.x; > 

Отслеживать

user302909

задан 29 июл 2020 в 19:48

425 3 3 серебряных знака 14 14 бронзовых знаков

Отвязать камеру о затылка ?

30 июл 2020 в 3:02

Тогда она не будет летать за персонажем при движении. Она привязывается к заду при клике, когда персонаж идёт, а потом отцепляется. Тогда нужно переписывать код движения, а я не знаю как это сделать правильно.

30 июл 2020 в 7:58

@Cordis, ну так что, что то подскажите?

Движение камеры за персонажем [2D платформер]

Сегодня напишем скрипт, который предназначен для того, чтобы камера следовала за объектом. Прежде всего, данный скрипт заточен под платформер, где игрок управляет неким персонажем. Например, как в игре Mario и подобные, важно то, что персонаж должен перемещаться влево или вправо, по оси икс. Камера будет плавно двигаться вслед за объектом, а также определять в какую сторону в данный момент движется объект. Это нужно, чтобы добавить смещение по иксу, то есть, если персонаж смотрит допустим вправо, то камера будет сдвинута немного вправо и вверх, если добавлено смещение по вертикали.

Чтож, создаем скрипт CameraFollow2D:

using UnityEngine; using System.Collections; public class CameraFollow2D : MonoBehaviour < public float damping = 1.5f; public Vector2 offset = new Vector2(2f, 1f); public bool faceLeft; private Transform player; private int lastX; void Start () < offset = new Vector2(Mathf.Abs(offset.x), offset.y); FindPlayer(faceLeft); >public void FindPlayer(bool playerFaceLeft) < player = GameObject.FindGameObjectWithTag("Player").transform; lastX = Mathf.RoundToInt(player.position.x); if(playerFaceLeft) < transform.position = new Vector3(player.position.x - offset.x, player.position.y + offset.y, transform.position.z); >else < transform.position = new Vector3(player.position.x + offset.x, player.position.y + offset.y, transform.position.z); >> void Update () < if(player) < int currentX = Mathf.RoundToInt(player.position.x); if(currentX >lastX) faceLeft = false; else if(currentX < lastX) faceLeft = true; lastX = Mathf.RoundToInt(player.position.x); Vector3 target; if(faceLeft) < target = new Vector3(player.position.x - offset.x, player.position.y + offset.y, transform.position.z); >else < target = new Vector3(player.position.x + offset.x, player.position.y + offset.y, transform.position.z); >Vector3 currentPosition = Vector3.Lerp(transform.position, target, damping * Time.deltaTime); transform.position = currentPosition; > > >

damping — регулируем плавность движения камеры.
offset — добавить смещение по вертикали и горизонтали.
faceLeft — если изначально персонаж «смотрит» влево, ставим галочку.

Чтобы всё работало, тот объект, которым управляет игрок, должен иметь стандартный тег Player. Стоит обратить внимание на функцию FindPlayer, к ней нужно обращаться каждый раз, когда используется респаун объекта, кроме того, учитывается и то, в какую сторону «смотрит» объект по умолчанию, например, FindPlayer(true), если «смотрит» влево. Здесь важно понимать, что суть не в том, куда смотрит персонаж во время перемещения, а то, в какую сторону движется объект, влево или вправо. Если вы хотите жесткую привязку, относительно лица, тогда надо удалить все строки с обработкой переменных lastX и currentX. А переменную faceLeft сделать статической:

public static bool faceLeft;

И изменять ее, через скрипт управления персонажа.

Допустим, вот так:

if(Input.GetKey(KeyCode.A))

Как сделать чтобы камера двигалась за игроком unity

СемёнН 24 июн 2019, 14:10

1max1 писал(а): needPos = targetPos + targetDirectionMove * needPrediction;
cameraPos = Vectro3.Lerp(cameraPos, needPos, speedMove * Time.deltaTime);

К сожалению ни чего не понял, из того что ты написал, и через пару месяцев родил код ниже (один из первых, который написал не по шаблону и который РАБОТАЕТ), теперь вопрос, на сколько сильно он грузит систему, стоит ли вообще его использовать, или твой вариант лучше(тогда если можно объясни по подробней)? Сейчас все работает как надо, но кажется, что фон слегка подергивается, шарик катится плавно.

Как все устроено: шарик падает откуда то там сверху, касается платформы, которая заставляет его катиться, к примеру вправо, а камеру, плавно сдвинуться чуть правее него и следовать за ним в этом положении, что бы было видно куда он там потом попадет, потом шарик попадает в область, которая заставляет его катиться вверх, камера при этом плавно сдвигается чуть выше шарика. и т.д.

Синтаксис:
Синтаксис: [ Показать ]
Используется csharp

using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;

public class Ontrigercoll : MonoBehaviour
{
public int speed = 5 ; // скорсть шарика
public float smooth = 5f ;
private Rigidbody2D rb ;
private Vector3 right = new Vector3 ( — 7, 0, 5 ) ; // позиция камеры при движении шарика вправо.
private Vector3 up = new Vector3 ( 0, — 4.5f, 5 ) ;
private Vector3 left = new Vector3 ( 7, 0, 5 ) ;
private Vector3 down = new Vector3 ( 0, 4.5f, 5 ) ;
private Vector3 z = new Vector3 ( 0, 0, 5 ) ;
private bool rightBool = false ; // определяет движение шарика вправо.
private bool leftBool = false ;
private bool upBool = false ;
private bool downBool = false ;

public void OnCollisionStay2D ( Collision2D col )
{
if ( col. gameObject . tag == «LuchRight» ) // если шарик касается этой платформы он катится вправо.
{
rb. AddForce ( new Vector3 ( speed, 0, 0 ) ) ;

rightBool = true ; // эта строка говорит камере, что шарик катится вправо.
}
if ( col. gameObject . tag == «LuchLeft» )
{
rb. AddForce ( new Vector3 ( — speed, 0, 0 ) ) ;

public void OnCollisionExit2D ( Collision2D col )
{
if ( col. gameObject . tag == «LuchRight» )
{
rightBool = false ;
}
if ( col. gameObject . tag == «LuchLeft» )
{
leftBool = false ;
}
}

public void OnTriggerStay2D ( Collider2D tr )
{
if ( tr. gameObject . tag == «LuchUp» )
{
rb. AddForce ( new Vector3 ( 0, speed, 0 ) ) ;

upBool = true ;
}
if ( tr. gameObject . tag == «LuchDown» )
{
downBool = true ;
}
}

public void OnTriggerExit2D ( Collider2D tr )
{
if ( tr. gameObject . tag == «LuchUp» )
{
upBool = false ;
}
if ( tr. gameObject . tag == «LuchDown» )
{
downBool = false ;
}
}

if ( rightBool ) // если шарик катится вправо, камера двигается чуть чуть перед ним
{
Camera. main . transform . position = Vector3. Lerp ( Camera. main . transform . position , transform . position — right, Time. deltaTime * smooth ) ;
}
if ( upBool )
{
Camera. main . transform . position = Vector3. Lerp ( Camera. main . transform . position , transform . position — up, Time. deltaTime * smooth ) ;
}
if ( leftBool )
{
Camera. main . transform . position = Vector3. Lerp ( Camera. main . transform . position , transform . position — left, Time. deltaTime * smooth ) ;
}
if ( downBool )
{
Camera. main . transform . position = Vector3. Lerp ( Camera. main . transform . position , transform . position — down, Time. deltaTime * smooth ) ;
}
}
}

Создание эффекта плавной камеры, следующей за объектом — краткий туториал

Создание скриптаУдалите часть, выделенную синим цветомВыберите функцию «LateUpdate» из выпадающего списка Переместите объект со сцены в поле «Object» в окне Inspector

Затем перетащите камеру, чтобы установить её базовое положение относительно объекта. Когда вы сделаете это, перенесите значение в поле «Distance From Object», которое находится в окне Inspector.

На этом этапе эффект плавной камеры выглядит вот так:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *