Пятница, 15 Ноября 2024, 04:29

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Помогите наладить слежение камеры за персонажем
mkarovДата: Воскресенье, 27 Января 2019, 19:42 | Сообщение # 1
был не раз
Сейчас нет на сайте
Делаю 2D платформер, не могу сделать чтобы камера плавно следила за персонажем, притом только по горизонтали. Кто знает помогите пожалуйста, заранее спасибо!

пробовал такой скрипт, но когда ходит сильно дребезжит.

Код
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;
  }
    }
}
IrbisДата: Воскресенье, 27 Января 2019, 23:05 | Сообщение # 2
почетный гость
Сейчас нет на сайте
Код
using UnityEngine;

public class CameraFollow2D : MonoBehaviour
{
    [SerializeField]
    private float _damping = 1.5f;
    
    [SerializeField]
    private Vector3 _offset = new Vector3(2f, 1f);
    
    [SerializeField]
    private bool _faceLeft;
    
    private Transform _player;
    private float _lastX;

    private void Start()
    {
        _offset.x = Mathf.Abs(_offset.x);
        _player = GameObject.FindGameObjectWithTag("Player").transform;
        
        if (_player != null)
        {
            _lastX = _player.position.x;
            transform.position = GetTargetPosition();
        }
    }
    
    private void Update()
    {
        if(_player != null)
        {
            var currentX = _player.position.x;
            if (!currentX.Equals(_lastX))
                _faceLeft = currentX < _lastX;
            _lastX = currentX;
            var position = GetTargetPosition();
            transform.position = Vector3.Lerp(transform.position, position, _damping * Time.deltaTime);
        }
    }
    
    private Vector3 GetTargetPosition()
    {
        var offset = _offset;
        offset.x *= _faceLeft ? -1 : 1;
        var position = _player.position + offset;
        position.z = transform.position.z;
        return position;
    }
}

Про "только по горизонтали" не понял. У вас скрипт работает не только на горизонталь. Сделал так же. Если что поправьте сами)
P.S. Правда в вашем варианте я тоже не замечал, чтобы что-то дребезжало)


Сообщение отредактировал Irbis - Воскресенье, 27 Января 2019, 23:28
mkarovДата: Понедельник, 28 Января 2019, 09:35 | Сообщение # 3
был не раз
Сейчас нет на сайте
Хм.... Попробовал ваш скрипт, но всё равно персонаж дёргается, значит проблема не в коде. А за скрипт спасибо!

Сообщение отредактировал mkarov - Понедельник, 28 Января 2019, 09:36
pixeyeДата: Понедельник, 28 Января 2019, 12:23 | Сообщение # 4
Red Winter Software
Сейчас нет на сайте
С большой долей вероятности твоя камера дергается потому что персонаж на ригидбоди и двигается по физике.

Код

    float smoothTime = .15f;
        Vector3 velocity;
public void FixedUpdate()
  {
   if (target == null) return;
                        var trCam =  Camera.main.transform;
                        var pos  = trCam.position;
   pos  = Vector3.SmoothDamp(pos  , target.position , ref velocity, smoothTime);
                        trCam.position = pos;
  }


Это навскидку.
ЕСЛИ твой персонаж не двигается по физике то камеру лучше клади в LateUpdate()


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Понедельник, 28 Января 2019, 12:39
erik3227Дата: Вторник, 29 Января 2019, 02:03 | Сообщение # 5
был не раз
Сейчас нет на сайте
Как то так плавна.

void Update()
{
var objb = GameObject.FindGameObjectWithTag("чебурашка");

Quaternion OriginalRot = transform.rotation;
transform.LookAt(objb.transform);
Quaternion NewRot = transform.rotation;
transform.rotation = OriginalRot;
transform.rotation = Quaternion.Lerp(transform.rotation, NewRot, speed * Time.deltaTime);

}
}


Сообщение отредактировал erik3227 - Вторник, 29 Января 2019, 02:10
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг