HALF-LIFE2 SDK TIPS



ハーフライフ2のHAMMERによるマップ作成に関する覚書です。
まだまだ初心者なのでわからないことだれらけです。
間違いや思い込みもあるかも。ジャンル分けは適当です。




Category List

全般
ブラシ
設備
NPC
物理オブジェクト
エンティティ
イベント
モデル
サウンド
その他

全般



ブラシ
3D Skybox
3D Skyboxを使うには、本当の空間とは別に作った空間にsky_cameraを配置する。sky_cameraエンティティのある場所が本空間の(0, 0, 0)の位置になる? とりあえずsky_camera置くだけで3D Skyboxになる。別空間にも光源を置くのを忘れないこと。フォグのかかり方とかまだよくわからない。



設備
格子状伸縮ドア
  1. 棒作ってfunc_door_rotatingにする
  2. 全ての棒の原点を、閉じたときに寄り集まる方の端に移動する
  3. 交互に斜めにして柵状にする。このときの角度をαとする
  4. 棒にそれぞれ違う名前を付ける(例:door1〜door6)
  5. 全ての棒のFlagsの'One-way'をチェックする
  6. 全ての棒の'Touch Opens'のチェックを外す(触ってひらくと、触るところによって開き方がかわるのでその回避のため。触って開きたい場合にはもうちょい細工が必要)
  7. 全ての棒の動く方向に合わせてFlagsの'X-Axis'または'Y-Axis'のどちらかをチェックする
  8. 棒の1個おきにFlagsの'Reverse Dir'をチェックする。偶数奇数のどちらかをチェックするかは動かす方向によって違う。
  9. 棒と棒の結節点にinfo_targetを置く
  10. info_targetにそれぞれ違う名前を付ける(例:target1〜target5)
  11. info_targetの'Parent'を、それぞれの位置からみて寄り集まる側の棒とする
  12. 棒の'Parent'を、それぞれの位置から見て寄り集まる側のinfo_targetとする
  13. 寄り集まる側の一番最初の棒の回転角'Distance'をαにする
  14. それ以外の棒の回転角'Distance'をαの2倍にする。(例:αが15なら30に)
  15. 寄り集まる側の一番最初の棒の速度を、他の棒の半分にする

開くときには全ドアに同時に'Open'入力を行えばOK。この例ならdoor*で。

はしごの作り方1
func_useableladderを使って。

  1. func_useableladderを配置する。
  2. func_useableladderのヘルパーを表示し、中心にある○を移動。すると、ラインでつながれた2つのボックスが表示される。
  3. それぞれのボックスを、はしごの開始位置と終了位置に移動。
  4. はしごから降りる床面にinfo_ladder_dismountを配置。
  5. はしごとなるモデルを配置。'models/props_c17/metalladder002.mdl'などのモデルを使うか、ブラシで作成。

注意点

func_useableladderは他のブラシと重なってはならない。(経路上に物があったらいけない? 検証してないのでよくわからない)

はしごの作り方2
func_ladderendpointsを作ってはしごを作る。

  1. はしごの開始位置にfunc_ladderendpointsを配置し、名前をつける。(例:ladder1)
  2. はしごの終了位置にもう1個func_ladderendpointsを配置し、別の名前を付ける。(例:ladder2)
  3. 開始位置のはしご(ladder1)の'Other'プロパティに、終了位置のはしご(ladder2)をセット。
  4. 終了位置のはしご(ladder2)の'Other'プロパティに、開始位置のはしご(ladder1)をセット。
  5. はしごから降りる床面にinfo_ladder_dismountを配置。
  6. はしごとなるモデルを配置。'models/props_c17/metalladder002.mdl'などのモデルを使うか、ブラシで作成。



NPC
攻撃開始
エンティティ配置の手順

  1. 動かすNPCを配置し、名前をつける。(例:npc1)
  2. assault_ralleypointエンティティを置き、名前をつける(例:ralley1)
  3. assault_assaultpointエンティティを置き、名前を着ける(例:assault1)
  4. ralley1の'Assault Point'にアサルトポイント(assault1)をセット。
  5. ai_goal_assaultエンティティを置き、名前をつける(例:goal1)
  6. goal1の'Actor to affect'に動かすNPC(npc1)を、'Rally Point Set'にラリーポイント(ralley1)をセット。

動作させるには以下の手順で。

  1. ai_goal_assault(goal1)にActivateイベントを送ると、NPCがラリーポイント(ralley1)に移動しはじめる。
  2. ai_goal_assault(goal1)にBeginAssaultイベントを送ると、NPCがアサルトポイント(assault1)に対して攻撃をはじめる。対象がポイントにいないときは、ポイントまで移動する。

余談。

  • ai_goal_assaultがなくても、NPCに対してAssaultイベントを送ることによりアクションを開始させることが可能だが、ai_goal_assaultを使った方が確実。
  • assault_assaultpointを繋げていけば、複数箇所を移動させていくことができる。

npc_template_maker
テンプレートとなるNPCと同じものを、いろんなところにたくさん作る方法。その手順。なお、このエンティティにはpoint_templateは必要ない。

  1. NPCエンティティを作成し、名前をつける。(例:npc1)
  2. NPC(npc1)のフラグの'Template NPC 'をチェック。
  3. NPCを出現させたい場所にinfo_npc_spawn_destinationエンティティを置き、名前をつける(例:dest1)。複数置いてもよい。
  4. npc_template_makerエンティティを配置し、名前をつける。(例:maker1)
  5. npc_template_maker(maker1)の'Name of template NPC'にNPC(npc1)を、'Name of Destination Group'に出現場所(dest1)をセット。
  6. npc_template_maker(maker1)に'Spawn'イベントを送ると、出現位置(dest1)にテンプレートNPC(npc1)と同じNPCが出現する。

余談

  • 同名の出現位置が複数ある場合はそのうちひとつにランダムで出現。
  • 同名のNPCが複数ある場合は一番若い番号のひとつのみが出現。


物理オブジェクト
func_physboxが沈むとき
func_physboxが地面に沈んでしまう、物と衝突しないなどの場合。まずこの現象は、物にpoint_templateを関連付けた際に起きることが多い。いちどダメになると、point_templateを削除しても直らないようだ。そこでenv_entity_makeを作って関連付けると直る・・・ような気がする。

env_entity_makerの使い方
env_entity_makerで物を作るときの使い方。この場合出現場所は元の物体のある場所になる。要point_template。

  1. テンプレートとなる物を置き、名前をつける(例:obj1)。複数でも可。NPCでも可。
  2. point_templateエンティティを置き、名前をつける(例:template1)
  3. point_template(template1)の'Template*'に、作成したいエンティティ(obj1)をセット。
  4. env_entity_makerエンティティをpoint_template(template1)と同じ位置に置き、名前をつける。(例:maker1)
  5. env_entity_maker(maker1)の'Point_template To Spawn'でpoint_template(template1)を選ぶ。
  6. env_entity_maker(maker1)に対して'ForceSpawn'イベントを送ると、物体が作成される。

余談

  • 親子関係を持つ複数の物体を一度に生成する場合、point_template(template1)の'Preserve entity names'フラグのチェックを外すこと。
  • マップ開始時に実体をひとつ作っておきたいときは、point_template(template1)の'Don't remove template entities'をチェックする。
  • point_templateとenv_entity_makerの位置を重ねておかないと出現位置がずれるぽい。
  • point_templateで作った実体が衝突判定を行なってくれない場合などに、env_entity_makerを使うと直ることがあるっぽい。



エンティティ
point_teleportによるテレポート
移動先はpoint_teleportエンティティのある位置か、元の物体の出現位置。trigger_teleportと違い、どこにいても移動させられるが、移動される対象はあらかじめ決めておかなければならない。

  • 移動させる物体を配置し、名前をつける(例:obj1)。
  • point_teleportエンティティを配置し、名前をつける(例:teleport1)。
  • point_teleport(teleport1)の'Entity To Teleport'に移動させる物体(obj1)をセット。プレイヤーを移動させたい場合は'!player'と記述。
  • point_teleport(teleport1)に対して'Teleport'メッセージを送るとテレポート。

trigger_teleportによるテレポート
ブラシ内に入ったものを転送させる。point_teleportと違い、枠内に入ってきたどんなものでも転送できる。

  • トリガーとなるブラシを作成し、trigger_teleportに変換して名前をつける(例:trigger1)
  • 移動先にinfo_targetまたはinfo_teleport_destinationを配置し、名前をつける(例:target1)
  • trigger_teleport(trigger1)の'Remote Destination'に、移動先(target1)をセット。
  • 指定した物体がtrigger_teleportに入ると、自動的にテレポートされる。

余談

  • info_targetとinfo_teleport_destinationに違いはないが、後者は人の形をしている。
  • テレポートした物体にのみメッセージを送りたい場合は、メッセージ送り先に'!activator'を指定。

電気パチパチ
電気ばちばちはpoint_tesra。



イベント
特殊な対象指定
イベント発生時の送信先に使える特殊な文字列。

  • !player: プレイヤーの指定。
  • !activator: トリガー起動したエンティティ。

FacePoserでは"!self", "!enemy", "!friend"なども使えるようだ。これがマップでも使えるかどうかは未テスト。

DisablePhyscannonPickupインプット壊れてる?
prop_physboxに'DisablePhyscannonPickup'イベントを送っても、エラーが出てフラグが変わってくれない。 バグ?


モデル
設備
ハシゴ: models/props_c17/metalladder002.mdl



サウンド
効果音
アイテムの出現音: AlyxEMP.Charge



その他


home