Моя версия скрипта для сидения.
только сейчас понял свою ошибку(исправляя один баг сотворил ещё один)
Присед тоже выливается в два скрипта и запись выглядет немного страшнее)
Сам скрипт
- Код: Выделить всё
var speed = 6.0;
var jumpSpeed = 8.0;
var gravity = 20.0;
var sitflag=0;
var roof=0;
private var range=2.0;//задётся высота крыши зависет от высоты контролера, поэтому правильней расчитывать
//но конкретно для моего случая сойдёт
private var moveDirection = Vector3.zero;
private var grounded : boolean = false;
function Update() {
if (grounded) {
// We are grounded, so recalculate movedirection directly from axes
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton ("Jump")) {
moveDirection.y = jumpSpeed;
}
}
// Apply gravity
moveDirection.y -= gravity * Time.deltaTime;
var hit : RaycastHit;
var controller : CharacterController = GetComponent(CharacterController);
if (Physics.Raycast (transform.position, Vector3.up, hit, range))//Каждый кадр выпукаем луч для проверки
{if (hit.collider){roof=1;}}//есть ли над нами крыша, нужен для устранения бага пробивания башкой препятсвия
else{roof=0;}//если есть крыша вешаем флаг 1
if (Input.GetButton("Sit") ){controller.height = 1.0;}//Собственно сам присед
if(roof==0){if(Input.GetButton("Sit")==false)controller.height = 2.0;}//если крыши над нами нет
sitflag=controller.height;//cидит ли персонаж? нужен для скрипта на камере, да и потом будет проще чем обращаться
var flags = controller.Move(moveDirection * Time.deltaTime);
grounded = (flags & CollisionFlags.CollidedBelow) != 0;
}
@script RequireComponent(CharacterController)
Скрипт близнец, который вешается на камеру
- Код: Выделить всё
var sitflag;//наш флаг из первого скрипта
private var x=0;//флаг который необходим чтобы камера после приседа останавливалась
function Update () {//реализуем в Update тк камера должна проверять постоянно
scriptParentSit = transform.parent.GetComponent(typeof(FPSWalker)) as FPSWalker; // получаем первый скрипт и наш флаг из него
sitflag = scriptParentSit.sitflag;
if ((sitflag== 1.0)&&(x==0)){transform.Translate(-0.5*Vector3.up);x=1;}//если сидим то опускаем камеру на 0,5
//(Pivot controlerr а находится по центру) поэтому с каждого конца при приседе убирается не по 1 а по 0.5
//если бы камеру понижали ровно на 1 то смотрелибы из центра контроллера
if ((sitflag == 2.0)&&(x==1)){transform.Translate(0.5*Vector3.up);x=0;}//если не сидим то поднимаем на теже 0.5
}
Скрипт реализовывает аналогичный присед из HL, те мы сидим пока нажата клавиша приседа. Если отжали под чем-то продолжаем сидеть.
Как только из под этого выходим разгибаемся.
Скрипт в принципе сыроват, но работает и общее направление я думаю ясно
Важное замечание Изспользую Update тк FixedUpdate в силу настроек физики проекта вызывается значительно чаще.
Но вам не мешает сделать это в функции FixedUpdate
НО В обоих скриптах должна использоваться одна(не знаю как правильней сказать) функция. Если в первом FixedUpdate, то и во втором тоже FixedUpdate и на оброт в противном случае будет присутствовать рассинхронизация камеры и приседа(на эти грабли уже наступал)