Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2014, 12:49   #1
SERG__ZV
Новичок
Джуниор
 
Регистрация: 19.01.2014
Сообщений: 1
Вопрос Пригрывание 2х анимаций

Здраствуйте я недавно начал изучать С# и пока знаю не больно много делал урок по видео и в конце урока был вот такой работающий скрипт
Код:
using UnityEngine;
using System.Collections;

public class DoorsButtonOpen : MonoBehaviour 
{
	public GameObject buttonOBJ;
	public GameObject Player;
	public GameObject DoorL;
	public GameObject DoorR;
	public float MinDist;
	private bool Doors = false;
	private bool button;
	
	void Update ()
	{
		Vector3 ButtonPosition;
		Vector3 PlayerPosition;
		ButtonPosition = buttonOBJ.transform.position;
		PlayerPosition = Player.transform.position;
		if(Vector3.Distance(ButtonPosition,PlayerPosition) <= MinDist)
		{
			if(Input.GetKeyDown(KeyCode.E) && Doors == false)
			{
			button = true;
			}
			if(Input.GetKeyDown(KeyCode.E) && Doors == true)
			{
			button = false;
			}
		}
		if(button == true)
		{
			Opening ();
		}
		if(button == false)
		{
			Closing ();
		}
		
	}
	void Opening()
	{ 
		if(Doors == false)
		{
			buttonOBJ.animation.Play ();
			DoorL.animation ["DoorL"].speed = 1.0f;
			DoorR.animation ["DoorR"].speed = 1.0f;
			DoorL.animation.Play ();
			DoorR.animation.Play ();
			Doors = true;
		}
	}
	
	void Closing()
	{
		if(Doors == true)
		{
		buttonOBJ.animation.Play();
		DoorL.animation["DoorL"].time = DoorL.animation["DoorL"].length;
		DoorR.animation["DoorR"].time = DoorR.animation["DoorR"].length;
		DoorL.animation["DoorL"].speed = -1.0f;
		DoorR.animation["DoorR"].speed = -1.0f;
		DoorL.animation.Play();
		DoorR.animation.Play();
		Doors = false;
		}
	}
}
я посчитал что могу сделать лучше так как у него слишком много проверок на переменную door переменная button ещё одна лишняя
создающая ненужную ступень (по моему)
но аоказалось что он всётаки умнее :-) так как у меня проигрываються сразу две анимации и это подтверждаеться проигрыванием сразу двух звуков которые я прикрепил для проверки
вот мой скрипт
Код:
using UnityEngine;
using System.Collections;

public class DoorsButtonOpenMy : MonoBehaviour 
{
	public GameObject buttonOBJ;
	public GameObject Player;
	public GameObject DoorL;
	public GameObject DoorR;
	public float MinDist;
	public AudioClip SoundOpen;
	public AudioClip SoundClosed;
	private bool Doors = false;

	
	void Update ()
	{
		Vector3 ButtonPosition;
		Vector3 PlayerPosition;
		ButtonPosition = buttonOBJ.transform.position;
		PlayerPosition = Player.transform.position;
		if(Vector3.Distance(ButtonPosition,PlayerPosition) <= MinDist)
		{
			if(Input.GetKeyDown(KeyCode.E) && Doors == false)
			{
				Opening ();
			}
			if(Input.GetKeyDown(KeyCode.E) && Doors == true)
			{
				Closing ();
			}
		}	
	}
	void Opening()
	{ 
			buttonOBJ.animation.Play ();
			DoorL.animation ["DoorL"].speed = 1.0f;
			DoorR.animation ["DoorR"].speed = 1.0f;
			DoorL.animation.Play ();
			DoorR.animation.Play ();
			Doors = true;
		    audio.PlayOneShot(SoundOpen);
	}
	
	void Closing()
	{

		buttonOBJ.animation.Play();
		DoorL.animation["DoorL"].time = DoorL.animation["DoorL"].length;
		DoorR.animation["DoorR"].time = DoorR.animation["DoorR"].length;
		DoorL.animation["DoorL"].speed = -1.0f;
		DoorR.animation["DoorR"].speed = -1.0f;
		DoorL.animation.Play();
		DoorR.animation.Play();
		Doors = false;
		audio.PlayOneShot(SoundClosed);
	}
}
Я упростил скрипт но он работает не так как надо..
Вопрос такой что я упустил?
SERG__ZV вне форума Ответить с цитированием
Старый 20.01.2014, 17:05   #2
RegedroN
 
Регистрация: 20.01.2014
Сообщений: 3
По умолчанию

Хорошая ошибка!))

Дело в том, что при нажатии в начале на клавишу "Е", исполняется метод Opening (), а в данном методе переменная Doors меняется на true и вторая проверка запускает метод Closing () в связи с тем, что Input.GetKeyDown(KeyCode.E) возвращает true пока не закончится теле функции update()!!!
То есть до начала обработки следующего кадра сцены!

Нужно заменить вот этот код:
Код:
if(Input.GetKeyDown(KeyCode.E) && Doors == false)
{
	Opening ();
}
if(Input.GetKeyDown(KeyCode.E) && Doors == true)
{
	Closing ();
}
Вот этим:
Код:
if( Input.GetKeyDown(KeyCode.E) ) {
        if( Doors == false ) {
		Opening ();
	}
	else {
		Closing ();
	}
}
RegedroN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажыте програму для создания gif-анимаций, которые после создания не теряют четкости pufystyj Софт 1 24.02.2011 01:50