今回はFPSを作ってみようのカテゴリで作ってきたスクリプトをJavaScriptからC#へと書き換えていきます。
今回は休憩記事ですね!
つい最近もどこかで見たような・・・・(;一_一)
前回は
銃を撃った時の当たり判定を行いました。
JavaScriptからC#への書き換え
当ブログは1年以上にわたってJavaScriptでスクリプトを記述してましたが、現在ではC#へと切り替えを行いました。
以前の記事はそのままJavaScriptのままにしておきますが、『FPSを作ってみよう』のカテゴリでは機能を積み上げていくカテゴリなので今回C#へとスクリプトを書き換えましょう。
書き換えのやり方としてはJavaScriptのスクリプトと同名のC#スクリプトを作り、JavaScriptで書いたスクリプトの内容をコピーしたらC#スクリプトのクラスの中身に貼り付けます。
フィールドや変数の部分をまず書き換えてから保存し、コンソールに表示されるエラーの内容を見ながら細かい部分を修正していきます。
動作していたものが動かなくなる可能性もあるので、WindowsパソコンならばCドライブのマイドキュメントにあるプロジェクトファイルをコピーしておくといいかもしれません。
全てのスクリプトの書き換えが終了したらJavaScriptを設定しているゲームオブジェクトに同名のC#スクリプトを取りつけます。
JavaScriptのスクリプトのインスペクタの設定値を見ながらC#のスクリプトのインスペクタの設定値も同じように変更します。
C#の設定値を変更したら取りつけていたJavaScriptをRemove Componentします。
AssetsフォルダにあるJavaScriptのファイルは念の為に取っておいてもいいかもしれません。
今まで作成してきたスクリプトは
CameraTransform、HandIK、MyChara、Shot、WeaponStatus
になります。
CameraTransformはMusasiの子要素のMainCamera
HandIK、MyCharaはMusasi
Shotは武器に設定していますが、今回Musasiに設定するように変更します。
WeaponStatusは武器(makarob)に設定しています。
C#への書き換えに関しては
を参考に書き換えてみてください。
書き換え時の補足情報
一部解り辛い部分があったので補足しておきます。
MyCharaスクリプトで走っているかどうかを判定している部分で
1 2 3 4 5 6 7 8 9 | if(Input.GetAxis("Run")) { runFlag = true; speed = runSpeed; } else { runFlag = false; speed = walkSpeed; } |
とInput.GetAxis(“Run”)で判定していましたが、C#だとbool型でないと判定出来ずエラーになるので
1 2 3 | if(Input.GetButton("Run")) { |
でRunに対応するボタンが押されているかどうかで判断するように変更します。
Shotスクリプトを武器自体に設定していましたが、これをMusasi君に設定するようにします。
Shotをそれぞれの武器に設定する必要もなく、武器全てに同じShotスクリプトを設定しているのもどうかと思いましたので・・・・。
またフィールドのMuzzle(銃口)をpublicにしてインスペクタで設定していましたが、武器を切り替える機能を搭載した時の切り替えが出来なくなるので、
武器を装備しているEquipゲームオブジェクトを入れるフィールドをpublicで宣言し、Startメソッド内でMuzzleを取得するようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Shot : MonoBehaviour { private float shotRange; // 銃の有効射程距離 private WeaponStatus weaponStatus; // 銃のステータススクリプト public Transform equip; // 装備している武器の親 private GameObject muzzle; // 銃口 private float muzzleRadius; // 弾の半径 private GameObject nearEnemy; // 一番近い敵 private Transform tempTra; void Start () { muzzle = equip.GetChild (0).Find ("Muzzle").gameObject; // 主人公のステータスを取得 weaponStatus = muzzle.GetComponentInParent<WeaponStatus>(); // 銃の射程距離を取得 shotRange = weaponStatus.GetRange(); // 弾の半径を取得 muzzleRadius = muzzle.transform.GetComponent<SphereCollider>().radius; } |
インスペクタで銃の親要素であるEquipをequipに設定します。
その子要素の最初(GetChild(0))からFindメソッドを使ってMuzzleで検索しゲームオブジェクトを設定します。
次にWeaponStatusスクリプトに宣言しているWeaponTypeです。
1 2 3 4 5 6 7 8 | public enum WeaponType { HandGun, ShotGun }; public class WeaponStatus : MonoBehaviour { |
WeaponTypeはpublicを付け、クラスの外に出して外部のスクリプトからも参照出来るようにしておきます。
その他の修正は先ほどのJavaScriptとC#の読み替えの記事を見て修正するようにしてください。
エラーが出やすい部分としてはフィールドや変数の宣言部分、for文をforeachに書き換え部分、コンポーネント取得時にGetComponentの後にある.を削除する、レイを使った処理でRaycastHitの変数の前にoutを付けるといった部分になります。
終わりに
今回は単なるC#への書き換えについての記事でFPSとは直接関係ないです。
次回の記事の機能を作成する前に以前の記事を参考にしていた方で、武器をキャラクターに持たせる時にヒエラルキーに武器を配置しゲームオブジェクトのScaleでサイズ調整していた方は
の記事を参考にモデルの銃のScale Factorを調整してキャラクターのサイズに合わせるようにしてください。
ヒエラルキー上のゲームオブジェクトのScaleを調整すると、子要素に何かのゲームオブジェクトがあり、そのゲームオブジェクトの移動や回転をしようと思うとうまくいかなかったりその他不具合の温床にもなりかねないので必ず確認してください。