Суть такова, при соприкосновении с триггером играет музыка. Всё просто =)
Сначала создаём класс 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
Сначала создаём класс 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
Скажи что за музыка играет
ОтветитьУдалитьJohnny B. Goode
Удалитьhttp://www.youtube.com/watch?v=S1i5coU-0_Q
А ты не знаешь как можно изменить переменную с другого класса в своем классе
УдалитьС этим ещё не очень разобрался, но суть такова...
УдалитьНапример в классе MyPawn, дочерний от класса Pawn, есть переменная Health, то тогда чтобы её изменить надо написать MyPawn(Pawn).Health . Например: MyPawn(Pawn).Health = 100. Вроде как то так =) Но если найдёшь что-нибудь поподробнее скинь суда пожалуйста ссылку.
нет не работает надо что то в var написать иначе выдает ошибку ((
УдалитьБыло бы классно увидеть код )
Удалитьок
Удалитьвот код там где надо добавить
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;
}
}
Вот нашел похожую проблему http://forums.epicgames.com/threads/953398-Variable-access-between-different-classes?highlight=accessing+variable
ОтветитьУдалитьТут, как мне кажется, проблема с SequenceAction, это ведь кисметовые штучки если я не ошибаюсь. Тут надо как то по другому попробовать. Сейчас мозг уже не соображает, поэтому пока более конкретно сказать не могу ) Я майнкрафт дальше генерации блоков не делал )
ОтветитьУдалитьдобавь меня где не будь а то как то на блоге переписываться не очень )
УдалитьP.S у меня тоже блог вот ссылка http://minecraft-newgame.blogspot.com/p/blog-page_12.html