четверг, 5 июля 2012 г.

4. Музыкальный триггер (Коллизия) (UDK Uscript)

Суть такова, при соприкосновении с триггером играет музыка. Всё просто =)

Сначала создаём класс MusicTrigger, дочерний от класса Actor. Делаем его placeable (размещаемым) и задаем ClassGroup(TEST) чтобы в Actor Classes он был в категории TEST (для удобства).

class MusicTrigger extends Actor
placeable
ClassGroup(TEST);

Чтобы музыку можно было выбирать, создадим для неё переменную Music типа SoundCue. После var напишем (Sound), тогда в окне свойств нашего триггера (в редакторе) настройка для переменной  Music будет в категории Sound.






var(Sound) SoundCue Music;



















Теперь в DefaultProperties нужно сделать CollisionCylinder, именно при соприкосновении с ним будет, вызываться событие Touch, в котором и будет прописано  воспроизведение музыки. Также будет неплохо разместить какой-нибудь меш, чтобы было видно где наш триггер, но это можно не делать. Обязательно нужно прописать bCollideActors=true, чтобы определялись столкновения.

DefaultProperties
{
//Коллизия
Begin Object Class=CylinderComponent Name=CollisionCylinder
CollideActors=true
CollisionRadius=+0040.000000
CollisionHeight=+0020.000000
End Object
CollisionComponent=CollisionCylinder
Components.Add(CollisionCylinder)

//Меш

Begin Object Class=StaticMeshComponent Name=StaticMeshComponent
          StaticMesh=StaticMesh'GenericGrounds2.SM.fern'
          Translation=(X=0.000000,Y=0.000000,Z=-40.000000)
          Scale3D=(X=1,Y=1,Z=1)
          CollideActors=true
          bAllowApproximateOcclusion=True
          bForceDirectLightMap=True
          bCastDynamicShadow=False
          LightingChannels=(Dynamic=False,Static=True)
End Object
Components.Add(StaticMeshComponent)

//Если true тогда определяет столкновения
bCollideActors=true
}

Осталось между var и DefaultProperties прописать что будет происходить в событии Touch.
Напомню что событие Touch вызывается при пересечении коллизии игрока с коллизией нашего триггера.
Внутри пишем PlaySound(music);. Функция PlaySound  проиграет музыку которая находиться по пути указанному в переменной Music. Можно конечно написать PlaySound(адрес файла);, но тогда можно будет поменять только  в скрипте, а это неудобно. Также я добавил сообщение которое будет показываться на экране (не в консоли). Там будет указанно название файла.

event touch(Actor Other, PrimitiveComponent Othercomp, Vector Hitlocation, vector HitNormal)
{
PlaySound(music);
WorldInfo.Game.Broadcast(self,Music);
}


Остаётся только запустить редактор и проверить. В редакторе открываем ActorClasses в категории TEST находим наш MusicTrigger, перетаскиваем на уровень. Заходим в его свойства (выделить и нажать F4). В Actor Browser выделяем любую мелодию (SoundCue) и в свойствах триггера в категории Sound нажимаем на зелёную стрелочку.



Если хотите посмотреть коллизию во время игры, нужно открыть консоль (~) и написать show collision

10 комментариев:

  1. Скажи что за музыка играет

    ОтветитьУдалить
    Ответы
    1. Johnny B. Goode
      http://www.youtube.com/watch?v=S1i5coU-0_Q

      Удалить
    2. А ты не знаешь как можно изменить переменную с другого класса в своем классе

      Удалить
    3. С этим ещё не очень разобрался, но суть такова...
      Например в классе MyPawn, дочерний от класса Pawn, есть переменная Health, то тогда чтобы её изменить надо написать MyPawn(Pawn).Health . Например: MyPawn(Pawn).Health = 100. Вроде как то так =) Но если найдёшь что-нибудь поподробнее скинь суда пожалуйста ссылку.

      Удалить
    4. нет не работает надо что то в var написать иначе выдает ошибку ((

      Удалить
    5. Было бы классно увидеть код )

      Удалить
    6. ок
      вот код там где надо добавить

      class trigger_put extends Actor
      placeable
      classGroup(Survival_Island);

      var() int wood;



      event touch(Actor Other, PrimitiveComponent Othercomp, Vector Hitlocation, vector HitNormal)
      {

      wood=Wood+100;
      }


      а вот где находиться переменная

      class CraftTest_SeqAct extends SequenceAction;
      var() int Wood;
      var() int Kirka;
      var() int plank;


      function Activated ()
      {

      if (wood>=4)
      {
      wood=wood-4;
      kirka=kirka+1;
      OutPutLinks[0].bHasImpulse = False;

      }
      else

      {

      OutPutLinks[1].bHasImpulse= false;
      Plank=plank-1;
      }

      }






      Удалить
  2. Вот нашел похожую проблему http://forums.epicgames.com/threads/953398-Variable-access-between-different-classes?highlight=accessing+variable

    ОтветитьУдалить
  3. Тут, как мне кажется, проблема с SequenceAction, это ведь кисметовые штучки если я не ошибаюсь. Тут надо как то по другому попробовать. Сейчас мозг уже не соображает, поэтому пока более конкретно сказать не могу ) Я майнкрафт дальше генерации блоков не делал )

    ОтветитьУдалить
    Ответы
    1. добавь меня где не будь а то как то на блоге переписываться не очень )
      P.S у меня тоже блог вот ссылка http://minecraft-newgame.blogspot.com/p/blog-page_12.html

      Удалить