Скрипт покачивание при ходьбе

Лучший способ помочь другим, поделиться своими находками.

Скрипт покачивание при ходьбе

Сообщение Fanrin 09 июл 2014, 19:03

Именно скрипт, а не анимация, задолбался искать. Вытащил из одного бесплатного исходника игры, оформил как отдельный скрипт
Мне кажется, нуждается в небольшой оптимизации
Если у кого есть подобные реализации, думаю все будут рады, если вы поделитесь х)

Просто кидаем скрипт на камеру
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class CamWiggle : MonoBehaviour {

        public float Smooth = 5;
        public float bobSpeed = 0.25f;
        public float bobAmount = 0.005f;

        private float defCamPos = 0;
        private float timer = 0.0f;
        private float camPos;
        private float waveslice;
        private float translateChange;
        private float totalAxes;
        private Transform MyTransform;

        void Start(){
                MyTransform = transform;
                defCamPos = MyTransform.localPosition.y;
                camPos = defCamPos;
        }

        void Update(){
                Vector3 camHeight = new Vector3(MyTransform.localPosition.x, camPos, MyTransform.localPosition.z);
                Vector3 smoothHeight = Vector3.Lerp(MyTransform.localPosition, camHeight, Time.deltaTime * Smooth);
                MyTransform.localPosition = smoothHeight;

                waveslice = 0.0f;
                float horizontal = Input.GetAxis("Horizontal");
                float vertical = Input.GetAxis("Vertical");
                if(Mathf.Abs(horizontal) == 0 && Mathf.Abs(vertical) == 0){
                        timer = 0.0f;
                }else{
                        waveslice = Mathf.Sin(timer);
                        timer = timer + bobSpeed;
                        if(timer > Mathf.PI * 2) {
                                timer = timer - (Mathf.PI * 2);
                        }
                }
                if(waveslice != 0){
                        translateChange = waveslice * bobAmount;
                        totalAxes = Mathf.Abs(horizontal) + Mathf.Abs(vertical);
                        totalAxes = Mathf.Clamp(totalAxes, 0.0f, 1.0f);
                        translateChange = totalAxes * translateChange;
                        MyTransform.localPosition = new Vector3(MyTransform.localPosition.x, smoothHeight.y + translateChange, MyTransform.localPosition.z);
                }else{
                        MyTransform.localPosition = new Vector3(MyTransform.localPosition.x, smoothHeight.y, MyTransform.localPosition.z);
                }
        }
}
Как-то раз, когда я ещё ничего не знал, я попросил помощи с JS скриптом на одном форуме. Прошел год, пока я ждал ответа, сам все выучил и понял, если хочешь что-то сделать - делай это сам... но вопросов на форуме я меньше от этого задавать не стану :D
Аватара пользователя
Fanrin
UNIт
 
Сообщения: 78
Зарегистрирован: 12 май 2014, 22:05

Re: Скрипт покачивание при ходьбе

Сообщение Fanrin 11 июл 2014, 03:41

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

В моем скрипте камера не просто ходит вверх-вниз, но и поворачивается. Все настраивается. Скрипт закомментировал, как мог, надеюсь кому-то пригодиться
Вешать так же, на трансформ с камерой
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;


public class CamWiggle : MonoBehaviour {

    public float targetTime = 0.2f; // Время на один шаг в секундах
    public float Smooth = 10; // Мягкость
    public float AmplitudeHeight = 0.1f; // Амлитуда покачивания вверх-вниз
    public float AmplitudeRot = 1.5f; // Амплитуда поворота  

    private float Progress; // Прогресс
    private int PassedStep = 1; // Шаг
    private float DefCamPos = 0; // Изначальная позиция камеры
    private float DefCamRot = 0; // Изначальный поворот камеры
    private Transform MyTransform; // Наш трансформ

       
    void Start() {
        MyTransform = transform; // Ну, я где-то прочитал что так будет работать быстрей
        DefCamPos = MyTransform.localPosition.y; // Изначальная позиция камеры
        DefCamRot = MyTransform.localEulerAngles.z; // Изначальный поворот камеры
    }


    void Update() {
        float Pssd = Passed(); // Наш прогресс
               
        // Позиция в Vector3, к которой мы стримимся
        Vector3 GoalPos = new Vector3(MyTransform.localPosition.x, Pssd * AmplitudeHeight + DefCamPos, MyTransform.localPosition.z);
        // Интерполяция позиции (сглаживание)
        MyTransform.localPosition = Vector3.Lerp(MyTransform.localPosition, GoalPos, Time.deltaTime * Smooth);


        // Поворот в Vector3, к которому мы стримимся
        if(Mathf.Abs(Input.GetAxis("Horizontal")) == 1 && Mathf.Abs(Input.GetAxis("Vertical")) == 0) {
            Pssd = 0; // Только если мы не идем в бок
        }
        Vector3 GoalRot = new Vector3(MyTransform.localPosition.x, MyTransform.localPosition.y, Pssd * AmplitudeRot + DefCamRot);
        // Интерполяция поворота (сглаживание)
        MyTransform.localEulerAngles = Vector3.Lerp(MyTransform.localPosition, GoalRot, Time.deltaTime * Smooth);
    }


    private float Passed(){

        // Если мы вообще никуда не двигаемся (право, лево, вперед, назад)
        // То возвращаем ноль
        if(Mathf.Abs(Input.GetAxis("Horizontal")) == 0 && Mathf.Abs(Input.GetAxis("Vertical")) == 0) {
            PassedStep = 1; // Сбрасываем шаг
            return (Progress = 0); // Прогресс сводим к нулю и возвращаем его
        }

        // Умножаем прогресс на шаг (PassedStep)
        // Если step = 1, то тогда значение не меняется.
        // А если step = -1, то тогда значение формулы становится отрицательным и мы начинаем вычитать из Progress
        Progress += (Time.deltaTime * (1f / targetTime)) * PassedStep;
        if(Mathf.Abs(Progress) >= 1) { // Если Progress больше или равно 1, или меньше или равно -1
            PassedStep *= -1; // Инвертируем шаг
        }

        // Возвращаем прогресс, он у нас шляется от -1 до 1
        return Progress;
    }
}
Как-то раз, когда я ещё ничего не знал, я попросил помощи с JS скриптом на одном форуме. Прошел год, пока я ждал ответа, сам все выучил и понял, если хочешь что-то сделать - делай это сам... но вопросов на форуме я меньше от этого задавать не стану :D
Аватара пользователя
Fanrin
UNIт
 
Сообщения: 78
Зарегистрирован: 12 май 2014, 22:05

Re: Скрипт покачивание при ходьбе

Сообщение HostGameStodios 14 июл 2014, 11:43

Клевый скрипт!Я думал можно только через анимацию камеры...
Моё умение-неправильно задавать вопросы.Так что если вы чего то не поняли вполне можете меня назвать дебилом,а потом попросить "перезадать" вопрос
Аватара пользователя
HostGameStodios
UNIт
 
Сообщения: 51
Зарегистрирован: 20 май 2014, 19:53

Re: Скрипт покачивание при ходьбе

Сообщение Petro111 03 фев 2015, 18:09

Fanrin писал(а):Ещё раз убедился, хочешь что-то сделать - сделай это сам
В общем, написал свою версию скрипта...

Спасибо тебе большое. Просто бесценная экономия времени ^:)^
Petro111
UNец
 
Сообщения: 23
Зарегистрирован: 05 янв 2015, 07:56

Re: Скрипт покачивание при ходьбе

Сообщение Petro111 11 фев 2015, 14:36

Обнаружил непонятный баг,
Скрипт из первого поста работает нормально, а вот чуть ниже (переписанный) во время непрерывной ходьбы постепенно опускает камеру. ЗАметно это уже секунд через 15. Через минуту-две камера висела так низко будто я на корточках иду. Но стоит остановиться на секунду и камера плавнено поднимается назад.
В юнити этого нет, а вот после сборки есть.
Petro111
UNец
 
Сообщения: 23
Зарегистрирован: 05 янв 2015, 07:56


Вернуться в Исходники (Копилка)

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

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