Jump to content

Бесконечная анимация и движение через скрипт открытия/закрытия двери (С# конечно же)


photo

Recommended Posts

Я тут решил открывать и закрывать двери через анимацию... Ну чтобы не лезть в серьезные программы, для создания простенького и не замысловатого трека и... Внезапно обнаружилась некоторая проблемка, а конкретно управление анимацией которые мы можем создать в движке. Процесс настолько замороченный, что после трех дней изучения темы, несмотря на активное курение бамбука, я так и не понял что движок от меня хочет. Так что здесь я выложу наработки и альтернативу. 

Вроде как разработчики работают над новой системой, так что есть надежда получить простой и толковый инструмент, а не вот это вот все .

Значит как запустить анимацию .track описано тут и там в прикрепленной теме:

Spoiler

 

Понятное дело что мои навыки программирования мягко говоря слабее навыков разработчиков, так что все что происходит в тех прикрепленных скриптах для меня работает на магии. Не знаю почему, но сам скрипт управления анимацией работает на сцене только если он такой один, т.е. повесить его на каждый необходимый мне объект или что-то типа того, не получится, видимо по этому там и список анимаций. Поэтому я сделал бесконечные анимации для объектов которые должны анимироваться бесконечно долго, а вот дверь я просто открываю вот так (слабонервным не смотреть, там ужас-ужас):

Spoiler
using System;
using System.Collections;
using System.Collections.Generic;
using Unigine;

[Component(PropertyGuid = "Ваш ID скрипта")]
public class Open_Close_Door_Station : Component
{
	public Node дверь_1;
	public Node дверь_2;
	public Node рычаг;

	bool открыть_закрыть;

	// define the movement speed
	public int скорость_открытия = -1;
	public int скорость_вращения = -10;

	float время_работы;
	public float время_работы_control;

	private void Init()
	{
		Unigine.Console.Run("console_onscreen 1");
	}
	
	private void Update()
	{
		if (Input.IsKeyDown(Input.KEY.F)) 
		{
          	//контроль открыта ли дверь положительное число, отрицательное - закрыта
			открыть_закрыть = !открыть_закрыть;
			скорость_открытия *= -1;
			скорость_вращения *= -1;

			Log.Message("Нажали кнопку F\n");
			Log.Message("открыть_закрыть = {0}\n", открыть_закрыть);
			Log.Message("скорость_открытия = {0}\n", скорость_открытия);
		}

		if(открыть_закрыть)
		{
			время_работы += Game.IFps;
			Log.Message("время_работы = {0}\n", время_работы);

			if(время_работы < время_работы_control)
			{
				if(дверь_1)
				{
					Дверь(дверь_1, скорость_открытия);
				}

				if(дверь_2)
				{
					Дверь(дверь_2, -скорость_открытия);
				}

				if(рычаг)
				{
					Рычаг(рычаг, скорость_вращения);
				}
			}
			else
			{
				открыть_закрыть = false;
				время_работы = 0;
			}
		}
	}

	void Дверь(Node дверь, int направление_скорость)
	{
		// get the frame duration
		//получить продолжительность кадра
		float ifps = Game.IFps;

		// enable visualizer
		//включить визуализатор
		Visualizer.Enabled = true;

		// get the current world transform matrix of the node
		//получить текущую матрицу преобразования мира узла
		mat4 transform = дверь.WorldTransform;

		// get the direction vector of the mesh from the second column of the transformation matrix
		//получить вектор направления сетки из второго столбца матрицы преобразования
		vec3 direction = transform.GetColumn3(1);
		
		// render the direction vector for visual clarity
		//визуализировать вектор направления для наглядности
		Visualizer.RenderDirection(дверь.WorldPosition, new vec3(direction), new vec4(1.0f, 0.0f, 0.0f, 1.0f), 0.1f, false);

		// calculate the delta of movement
		//рассчитать дельту движения
		vec3 delta_movement = direction * направление_скорость * ifps;

		// set a new position to the node
		//установить новую позицию для узла
		дверь.WorldPosition = дверь.WorldPosition + delta_movement;
	}

	void Рычаг(Node рычаг, int направление_скорость)
	{
		//рычаг.SetWorldRotation(рычаг.GetWorldRotation() * new quat(0.0f, 0.0f, направление_скорость * Game.IFps));

		quat rot = рычаг.GetWorldRotation();
		rot = new quat(направление_скорость * Game.IFps, 0.0f, 0.0f) * rot;
		рычаг.SetWorldRotation(rot);
	}
}

 

Мда... Такие дела.

Само движение двери взято отсюда Basic Object Movements.

Вращение вот отсюда Rotating a node in World Coordinates?

 

Edited by nikolay.sykharev
  • Like 1
Link to comment
×
×
  • Create New...