Hammer'da asansörler ve trenler: func_door'dan func_tracktrain'e
Source ve GMod haritalarında asansör ve trenler: hangi entity uygun, keyvalue'larla kurulum, çağrı butonları, path_track rotaları, ezilme ve sarsıntı nedenleri.
İki duraklı bir asansörü bir func_door ya da func_movelinear ile, birden çok katı ya da trenleri ise path_track entity'lerinden oluşan bir zinciri izleyen bir func_tracktrain ile yaparsın. Bir engelleme hasarı değeri ayarlıysa ve entity engellendiği hâlde itmeye devam ediyorsa oyuncular ezilir. Yolculuk sırasındaki sarsıntıyı Valve wiki'si, çok oyunculu Source oyunlarında dikey hareket eden platformların genel bir özelliği olarak tanımlar. Bir çözüm belirtmez; bu yüzden asansörü erken test et. Bir asansör çoğunlukla yolunda bir şey durduğu ya da rota yanlış zincirlendiği için takılıp kalır.
Hangi iş için hangi entity
| Entity | Hareket | Ne için uygun | Sınırları |
|---|---|---|---|
func_door | iki konum arasında, mesafe = brush boyutu eksi Lip | iki duraklı basit asansör | arada duramaz |
func_movelinear | tek bir yön boyunca Move Distance kadar, SetPosition ile aradaki her konum | iki duraklı asansör, platformlar, büyük kapılar | Valve wiki'sine göre başka bir func_movelinear entity'sine parent'landığında hatalı |
func_tracktrain | bir path_track zinciri boyunca | birden çok kat, trenler, virajlar | daha fazla iş, yüksek hızda hedefinin biraz önünde durur |
func_tanktrain, oyuncuya ateş eden ve öldürülebilen bir trendir; bu yüzden buraya uymaz. func_train ve func_plat GMod'un FGD'sinde yoktur.
İki duraklı bir asansör
En az iş çıkaran func_movelinear olur:
- Kabin zeminini brush olarak yap,
Ctrl+Ttuşlarına bas vefunc_movelinearseç. Ad:lift. Move Direction (Pitch Yaw Roll)değeriniUpyap. Alanda o zaman-90 0 0yazar.Move Distancealanına iki zemin arasındaki mesafeyi birim cinsinden,Speedalanına da hızı gir.- Kabinin duvarlarını ve tavanını
func_brusholarak yap veParentalanınaliftadını gir. - Her kata çağrı butonu olarak bir
func_buttonyerleştir ve asansöre bağla.
Entity My Output Target Entity Target Input
button_up OnPressed lift Open
button_down OnPressed lift Close
lift OnFullyOpen door_top Open
lift OnFullyClosed door_bottom Open
Open son konuma gider, Close başlangıç konumuna geri döner. OnFullyOpen ve OnFullyClosed varışı bildirir; kat kapılarını bunlarla açarsın. Output'ların, gecikmelerin ve adların ayrıntılı olarak nasıl çalıştığı Hammer'da input ve output yazısında anlatılıyor.
func_door ile hesap farklıdır: bir kapı her zaman kendi brush boyutundan Lip çıkarıldığı kadar yol alır. 256 birim yükselmesi gereken 16 birim kalınlığındaki bir zemin bu yüzden -240'lık bir Lip ister. Buna -1 olarak ayarlanmış Delay Before Reset (-1 stay), Toggle flag'i ve işareti kaldırılmış Touch Opens eklenir.
Kabindeki kapılar ve butonlar
Birlikte hareket etmesi gereken her şeyin Parent alanına hareket eden entity'nin adı yazılır. Bir çocuk, parent'ına olan mesafesini korur ve her hareketi izler.
- Kabin kapıları:
Parent=liftolan ikifunc_doorentity'si. Tablodaki parent hatası yüzünden burada ikinci birfunc_movelinearkullanma. - Kabindeki butonlar:
Parent=liftolanfunc_button.Don't moveflag'i ile buton basıldığında duvarın içine girmez. - Butonları kilitleme:
OnPressedile tüm butonlara (lift_button*)Lockinput'unu,OnFullyOpenveOnFullyClosedile de yenidenUnlockgönder. - Sandbox araçları: GMod'un FGD'si bu entity'ler için
Allow Physics GunveSandbox Tool Whitelistsunar. Sandbox'ta kimse asansörü Physics Gun ile tutmasın diye ilkiniNoyap.
func_tracktrain ile trenler ve birden çok kat
- İlk
path_trackentity'sini yerleştir ve onatrack_1gibi bir ad ver. Shift'e basılı tutarak klonlarsan Hammer adı birer birer artırır veNext Stop Targetalanını kendisi doldurur. - Treni, ön tarafı X ekseni boyunca, yani üstten görünümde sağa bakacak şekilde yap. Spawn olduğunda bir sonraki
path_trackyönüne döner. - Onu
func_tracktrainentity'sine çevir veFirst Stop Targetalanına ilkpath_trackadını gir. Tren orada spawn olur. Max Speed (units / second)her hızı sınırlar.Initial Speed (units / second)değerinin 0 olması, trenin başlangıçta durduğu anlamına gelir.No User Controlflag'ini ayarla. Asansör için, kabin dönmesin diyeFixed Orientationda ekle.StartForwardinput'uyla başlat. Bir duraktapath_track,OnPassüzerinden treneStopgönderir.
Döngü için son path_track entity'sinin Next Stop Target alanına ilkini gir. Bir path_track üzerindeki New Train Speed hızı o noktadan itibaren değiştirir, ama yalnızca No User Control ile etkili olur.
GMod'da func_tracktrain ayrıca MoveToPathNode input'una sahiptir. Aynı yol üzerindeki adı verilen path_track entity'sine gider ve orada durur. Bu, çok katlı bir asansörü basitleştirir:
Entity My Output Target Entity Target Input Parameter Delay
button_floor3 OnPressed lift_door Close 0.00
button_floor3 OnPressed lift MoveToPathNode floor_3 1.00
lift OnArrivedAtDestinationNode lift_door Open 0.00
Valve wiki'si iki tuhaflık daha sayar: bir func_tracktrain yönünü saniyede yalnızca on kez günceller, bu yüzden hızlı trenler dar virajlarda rotanın dışına taşar. Ayrıca ilgili path_track entity'lerinde New Train Speed 0 ise Reverse ya da StartBackward başarısız olabilir.
Asansörler neden ezer, sarsılır ya da takılıp kalır
Ezilme. Üç entity'nin her birinin kendi hasar değeri vardır: func_door için Blocking Damage, func_movelinear için Block Damage, func_tracktrain için Damage on Crush. Varsayılan her yerde 0'dır. Kapı ve func_movelinear için FGD değeri frame başına belirtir; yani küçük sayılar hızlı öldürür. Entity'nin engellendiğinde nasıl davrandığı herkese açık Source SDK kodunda görülebilir: bir func_door geri döner; Delay Before Reset negatifse ya da Force Closed ayarlıysa dönmez. Bir func_movelinear hiçbir zaman geri dönmez ve itmeye devam eder. 0 ile asansör engelleme hasarı vermez, ama kuyudaki bir oyuncu onu durdurabilir. Yani ya 0'da bırakıp kuyuyu, ancak asansör vardığında açılan kat kapılarıyla kapatırsın ya da bir hasar değeri ayarlayıp asansörün kazanmasına izin verirsin. func_door üzerinde OnBlockedClosing ve OnBlockedOpening ile kendin tepki verebilirsin.
Sarsıntı. Valve wiki'si, dikey hareket eden her platformun çok oyunculu oyunlarda üzerindekilere sarsıntılı göründüğünü belirtir ve neden olarak oyuncuların ağ fiziğini gösterir. Valve wiki'sindeki asansör eğitiminin tartışma sayfasından bir ipucu, belgelenmemiş ve her haritanın doğruladığı bir şey değil: oyuncuların doğrudan func_tracktrain üzerinde değil, ona parent'lanmış bir func_brush üzerinde durmasını sağla. FGD, func_brush için Solid BSP keyvalue'sunu tam da bu durum için tanımlar: hareket eden bir nesnenin hiyerarşisinde yer alan ve oyuncuların üzerinde durduğu bir brush. Sonucu, GMod haritasını oyuncularla test etme yazısında anlatıldığı gibi ping'li gerçek bir sunucuda kontrol et.
Kabindeki prop'lar. Bir prop_physics fizik tarafından simüle edilir ve Valve wiki'sine göre parent'ladığında tuhaf davranır. Bu yüzden kabindeki dekorasyon, asansöre parent'lanmış bir prop_dynamic olarak yer almalıdır. Hareket eden bir platformdaki serbest fizik prop'ları kayabilir ve sıkışabilir. Bu, pratikten gelen bir deneyimdir, belgelenmiş bir davranış değil. Prop türleri prop_static, prop_dynamic ve prop_physics yazısında karşılaştırılıyor.
Takılıp kalma. Yolda bir şey mi var? Bir path_track üzerinde Disabled ya da Disable train flag'i mi ayarlı, yoksa Next Stop Target mı boş? Asansör engellendiği ve OnFullyOpen hiç gelmediği için butonlar kilitlenip bir daha açılmadı mı? func_tracktrain üzerinde Is unblockable by player flag'i, onu engelleyen oyunculara karşı işe yarar.
Sık sorulan sorular
func_tracktrain'im neden tam path_track'te durmuyor?
Tren hedefinin hemen önünde durur; yüksek hızda bu daha belirgindir. Duraktan önce hızı düşür ya da kabin hizalanana kadar path_track entity'sini eksik mesafe kadar kaydır.
Kabin yolculuk sırasında neden yanlış aydınlatılıyor?
Brush entity'ler, başlangıç konumlarına göre önceden hesaplanmış lightmap'ler taşır; kabin farklı aydınlatılmış bir alana girdiğinde bunlar artık uymaz. Çözüm: görünen kabini bir prop_dynamic olarak yap ve görünmez bir brush'a parent'la. Daha fazlası Source Engine ışıklandırma rehberinde.
Oyuncular bir treni kendileri sürebilir mi?
Evet, trendeki No User Control flag'i kapalı olduğu sürece. Valve wiki'sine göre bir func_tracktrain üzerinde duran oyuncu o zaman onu kontrol edebilir. Train Name ve Parent değerlerinin ikisi de treni gösteren bir func_traincontrols bunu kendi brush'ıyla sınırlar: oyuncunun onun içinde ve trenin üzerinde durması gerekir.