スポンサーリンク

Unity実習19、攻撃を作ってみよう

SnapCrab_NoName_2016-6-2_18-49-37_No-00.jpg

攻撃は当たり判定処理をするColliderを使って作るそうです
それぞれのダメージを与える場所と、ダメージを受ける場所にコライダコンポーネントを設定、コライダ同士が重なると関数が呼びだされてダメージの処理を~と、なんとなくイメージは出来ますね
では、やっていきます

HierarchyビューにあるPlayerと親子関係になっている Hips を選択
SnapCrab_NoName_2016-6-2_14-46-23_No-00.jpg

InspectorでAdd Component > Physics > Box Collider を選択
キャラクターが四角で囲われます
SnapCrab_NoName_2016-6-2_14-48-31_No-00.jpg

SnapCrab_NoName_2016-6-2_14-48-45_No-00.jpg

この四角いコライダ以外にも
Sphere Collider(球状)
Capsule Collider(カプセル状)
Mesh Collider(3D オブジェクトの形状に沿った形)
なんてものもあります
Meshは処理が重いそうですが、リアル系のはきっと全部これなんでしょうねぇ

コライダのサイズを 1.7/1/1 に変更、キャラクター全体を覆う大きさになります
SnapCrab_NoName_2016-6-2_15-2-16_No-00.jpg

SnapCrab_NoName_2016-6-2_15-2-26_No-00.jpg

コライダの Is Trigger にチェックを入れます
ここにチェックを入れるとコライダが何かにぶつかってもすり抜けるようになります
SnapCrab_NoName_2016-6-2_15-11-28_No-00.jpg

Add Component > Physics > Rigidbody を追加します
追加をしたら Is Kinematic にチェックを入れます
Rigidbodyは移動するオブジェクトには取り付けるもの?だそうです
これを付けると、物理エンジンの方に「こいつは動くぞ」と教えててくれるので、衝突計算の時に変な数値にならない
そんなことが書かれてます
Is Kinematicにチェックを入れると、物理シュミュレーションによる移動をしなくなります
何かが当たってプレイヤーがぶっ飛んでったりしなくなる、そんな感じ
SnapCrab_NoName_2016-6-2_15-13-54_No-00.jpg

レイヤーの追加
Unityの物理エンジンは物体同士の当たり判定等をレイヤーごとで設定することができるそうです、賢いねぇ
メインメニューのEdit > Prohect Settings > Tags and Layers を選択
SnapCrab_Unity Personal (64bit) - GameSceneunity - UNIDRA - PC Mac Linux Standalone DX11_2016-6-2_15-29-14_No-00

Inspectorでレイヤーの名前を変更します
Layer8 : Ground 
Layer9 : EnemyHit 
Layer10 : PlayerHit 
Layer11 : EnemyAttack
Layer12 : PlayerAttack
それぞれの使いみちは、地面、敵のダメージを受ける部分、プレイヤーのダメージを受ける部分、敵の攻撃部分、プレイヤーの攻撃部分
SnapCrab_NoName_2016-6-2_15-30-27_No-00.jpg

Hipsのレイヤーを PlayerHit にします
このレイヤーはプレイヤーの攻撃の設定だけに使います
変更する際に子の方にも設定を反映させるか?と出るので、No を選んでおきましょう
SnapCrab_NoName_2016-6-2_15-39-26_No-00.jpg

UNIDRA_DATA/Data/MainGame/Scripts/Chapter10/ にある
HitArea.cs と AttackArea.cs
を、Projectビューの Assets/Script にドラッグ&ドロップ
SnapCrab_NoName_2016-6-2_15-49-31_No-00.jpg

すると、エラーが出て謎のウィンドウが出ます
どうやら、スクリプトの仕様変更があって、Unity5が「このスクリプトの一部を5用に書き換えようか?」と聞いてきている感じ
せっかくなので Go Ahead! を選んで書き換えてもらいましょう、するとエラーは消えます
SnapCrab_NoName_2016-6-2_15-48-34_No-00.jpg

HipsのInspectorに、HitArea を取り付けます
SnapCrab_NoName_2016-6-2_16-14-26_No-00.jpg

Inspectorにある Prefab の Apply を押します
プレイヤーの当たり判定はこれでお終い

Wargの当たり判定をセットアップする
前回の作業で既にSceneビューにWargのプレハブが居ると思います
居ない場合は、Projectビューから放り込んで下さい
HierarchyのWargの子オブジェクトにある Root を選択
SnapCrab_NoName_2016-6-2_16-5-42_No-00.jpg

Inspectorに Box Collider と Rigisbody と HitAreaスクリプト を追加
Box Colliderの値を
Center X: 0 Y: 0.6 Z: 0.3
Size X: 0.8 Y: 1.3 Z: 2
RigidbodyのIs Kinematicにチェックを入れます
SnapCrab_NoName_2016-6-2_16-10-26_No-00.jpg

Layerを EnemyHit に変更
再び子オブジェクトにも反映するかと聞かれるので No
Inspectorの Prefab にある Apply を押します
SnapCrab_NoName_2016-6-2_16-24-35_No-00.jpg

攻撃判定の作成
プレイヤーの武器に攻撃判定を付け加えます
Hierarchyの検索欄で Sword01 と検索
SnapCrab_NoName_2016-6-2_17-12-22_No-00.jpg

出てきたSeord01を選択して、検索欄の右にある✕を押して検索を解除すると、Hierarchyのツリーが展開されます
SnapCrab_NoName_2016-6-2_17-13-20_No-00.jpg

Sword01のInspectorに、Capsule Collider と Rigidbody をAdd Component > Physics から追加
Capsule Colliderの Direction を Z-axis に変更、これでZ方向にカプセルが伸びるようになりました
Is Trigger にチェックを入れて
Radius を 0.2
Height を 1
CenterのZ座標をいじれば、剣のつばから先へ、Colliderが伸びているようにも出来ます
Rigidbodyの Is Kinematic にもチェックを入れておきます
SnapCrab_NoName_2016-6-2_17-21-1_No-00.jpg

レイヤー設定
Inspectorの Layer を PlayerAttack に変更
SnapCrab_NoName_2016-6-2_17-33-57_No-00.jpg

ProjectのAssets/Scriptにある AttackArea.cs をSword01のInspectorに取り付け
SnapCrab_NoName_2016-6-2_17-41-40_No-00.jpg

Wargの攻撃判定の設定
HierarchyでWargツリーにある HEAD1_C を探します
SnapCrab_NoName_2016-6-2_17-45-26_No-00.jpg

Inspectorに Sphere Collider と Rigid body を追加
Is Triggerにチェック
Center X: 0 Y: 0.3 Z: 0
Is Kinematicにチェック
Layerを EnemyAttack (ダイアログが出たら No)
AttackArea.csを取り付け
SnapCrab_NoName_2016-6-2_17-47-28_No-00.jpg

レイヤー間の接触の検出の設定
Unityはどのレイヤーとどのレイヤーのコライダが接触するかしないかを設定できます
プレイヤー同士で攻撃が当たらないようにしたり、剣に当たって自分がダメージを受けないようにしたりと
メインメニューからEdit > Project Setting > Physicsを選択
SnapCrab_Unity Personal (64bit) - GameSceneunity - UNIDRA - PC Mac Linux Standalone DX11_2016-6-2_17-56-36_No-00

下の図のように設定して下さい
SnapCrab_NoName_2016-6-2_18-1-15_No-00.jpg

アニメーションイベントを使う
これで攻撃出来るようになりましたが、今のままだと歩いて剣が当たっただけでダメージが入ってしまうので
前回作成したアニメーションイベントを使います

ProjectビューのAssets/Scriptに UNIDRA_DATA/Data/MainGame/Scripts/Chapter10/にある AttakAreaActivator.cs をドラッグ&ドロップ
また、Unity5用に書き換えるかと言われるのでGo Ahead!!!
SnapCrab_NoName_2016-6-2_18-8-47_No-00.jpg

AttackAreaActivator をPlayerとWargに取り付けます
SnapCrab_NoName_2016-6-2_18-17-21_No-00.jpg

SnapCrab_NoName_2016-6-2_18-17-51_No-00.jpg

プレハブの更新
色々な変更をしてきたので、設定を反映させます
Player と Warg のInspectorにある Prefab の Apply を押します
さっきも何度か押してあるやつですね
あれは、本には書いてありません
Unity5へのスクリプトの変換がどうのって、探したサイトで押しておいたほうが良いとのことだったので、おまじない的なね
今回のは最後の締めで押すことになっているのでお忘れなく
SnapCrab_NoName_2016-6-2_18-24-56_No-00.jpg

本だとこの後、試しに攻撃すると、敵にダメージが入って、Wargのステータス(HP)が減ります!とか書いてあるが

減らない

そしてエラーが出ました
SnapCrab_NoName_2016-6-2_18-31-17_No-00.jpg

なんでやねん、と思ったらサポートページに正誤情報として載ってまして

■P.206ページ中
誤:「攻撃を当てたらWargをHierarcyビューで選択して……確認してください。」

正:「敵に攻撃が当たると
SendMessage Damage has no receiver!
というエラーメッセージがConsoleウインドウに表示されますが、これはEnemyCtrl.csにDamage関数がまだ存在しないためSendMessageで呼び出せる関数が無いのでエラーとなっています。敵のDamge関数は11章でインポートするEnemyCtrl.csの中にPlayerCtrl.csと同様のDamge関数が実装されています。」


つまり、次のステップに行くまではWarg死なないと
次のステップは「AIを作ってみよう」とのことで、また新しいことなのでとりあえず今回はこのスクリプト追加しないで
「まぁ、HP減るんだろうな」という感じで終わらせておきます

次回AI作成!と行きたいところですが、まだドラゴンの攻撃を作ってないので、次回はそこをやります
関連記事

Leave a Reply


管理者にだけ表示を許可する

Comment

Leave a Reply


管理者にだけ表示を許可する