前回の記事
今回は前回の記事で設置した銃にエイムを実装してみましょう。
マウスをクリックすると銃が動くわけですがその動く仕組みは以下の2つの方法どちらかで実装することになると思います。
- AnimaterController、Animationの機能を使い銃の位置が変わるアニメーションを再生する。
- ObjectのTransformを動的に変更する。
今回はスクリプトのみで実装するので、後者を採用することにしましょう。
前回の記事
今回は前回の記事で設置した銃にエイムを実装してみましょう。
マウスをクリックすると銃が動くわけですがその動く仕組みは以下の2つの方法どちらかで実装することになると思います。
今回はスクリプトのみで実装するので、後者を採用することにしましょう。
前回の記事
前回の記事まででFPSの基本的な視点操作を実装しました。
今回は銃をつけて打てるようにしたいと思います。
それでは必要な無料アセットを紹介します。
近未来の武器感がよかったのでこれにしました。
①これをインポートしてください。
こんなフォルダができました。
Prefabにはそのままシーンに配置してマテリアルも割り当てられたものができるのでそれを使いましょう。
赤が好みなんで赤にします。
②シーンに配置してください
その銃をMain Cameraの子オブジェクトにします。
以下のような構造になります。
③武器の位置をいい感じに調節します。
私の場合、以下のようになりました。インスペクターの位置も確認してみてください。
回転はさせていません。
いい感じですね。
次回は画面真ん中の十字とエイムを実装していきたいと思います。
前回の記事
UnityでFPSゲームを作る③RigidBodyとジャンプの実装
前回の記事で実装したジャンプの連続で飛べてしまうという問題点を直島しょう。
実装するアルゴリズム
床にtagをつけ床にPlayerのClliderが接触しているかつスペースキーが押されたときにジャンプするようにする。
①Groundタグを作成する。
PlayerのインスペクターからGroundタグを作成しアタッチします。
②スクリプトを変更する。
前回のPlayerJump.csを以下のように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerJump : MonoBehaviour { public GameObject Player; private Rigidbody PlayerRigid; public float Upspeed; // Use this for initialization void Start () { PlayerRigid = Player.GetComponent<Rigidbody>(); } // Update is called once per frame void Update () { } void OnCollisionStay(Collision col) { if (col.gameObject.tag == "Ground" && Input.GetKey(KeyCode.Space)) //Groundと接触している、かつスペースキーが押されたとき { PlayerRigid.AddForce(transform.up * 130); } } } |
地面となるオブジェクト(その上でジャンプを許可したいオブジェクト)にはGroundタグをアタッチしてください
前回の記事
前回までで基本的なFPSの視点操作を実装しました。
今回は物理演算(RigidBody)とジャンプを実装します。
①空のPlayerオブジェクトにRigidbodyコンポーネントとCapsule Colliderを追加。
設定は以下の通りです。
Use GravityにチェックをいれConstraintsのFreeze Rotationすべてにチェックを入れます。これで転がらなくなります。
Capsule ColliderはEdit Clliderをクリックし形を調整します。
CenterのYを調節し地面の高さより少し高くします。
床をすり抜ける場合は床にColliderが付いているかを確認してください。
②ジャンプを実装します。
新しいスクリプト、PlayerJump.csを作成し、Playerオブジェクトにアタッチします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerJump : MonoBehaviour { public GameObject Player; private Rigidbody PlayerRigid;//PlayerオブジェクトのRigidbobyを保管する public float Upspeed; //ジャンプのスピード // Use this for initialization void Start () { PlayerRigid = Player.GetComponent<Rigidbody>(); } // Update is called once per frame void Update () { if (Input.GetKeyDown(KeyCode.Space)) { //上にジャンプする。 PlayerRigid.AddForce(transform.up * Upspeed); } } }34 |
インスペクターでの設定は以下の通りです。
PlayerにPlayerをアタッチし、Upseedはスペースキーを押したときの力の大きさです。調整してみてください。
以下のようになります。しかしこのスクリプトには問題があります。
上記のスクリプトの問題点
次回はこの問題を解決してみます。
前回の記事
前回の記事で作ったFPS視点のスクリプトの問題点を改良します。
前回のスクリプトの問題点
ので縦方向の視点操作を制限しましょう。
以下が前回のPlayerController.csを改良したものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { public GameObject Player; public GameObject Camera; public float speed; private Transform PlayerTransform; private Transform CameraTransform; private float ii; // Use this for initialization void Start () { PlayerTransform = transform.parent; CameraTransform = GetComponent<Transform>(); } // Update is called once per frame void Update () { float X_Rotation = Input.GetAxis("Mouse X"); float Y_Rotation = Input.GetAxis("Mouse Y"); PlayerTransform.transform.Rotate(0, X_Rotation, 0); ii = Camera.transform.localEulerAngles.x; if (ii > 334 && ii < 360 || ii > 0 && 79 > ii) { CameraTransform.transform.Rotate(-Y_Rotation, 0, 0); float kk = Y_Rotation; } else { if (ii > 300) { if (Input.GetAxis("Mouse Y") < 0) { CameraTransform.transform.Rotate(-Y_Rotation, 0, 0); } } else { if (Input.GetAxis("Mouse Y") > 0) { CameraTransform.transform.Rotate(-Y_Rotation, 0, 0); } } } float angleDir = PlayerTransform.transform.eulerAngles.y * (Mathf.PI / 180.0f); Vector3 dir1 = new Vector3(Mathf.Sin(angleDir), 0, Mathf.Cos(angleDir)); Vector3 dir2 = new Vector3(-Mathf.Cos(angleDir), 0, Mathf.Sin(angleDir)); if (Input.GetKey(KeyCode.W)) { PlayerTransform.transform.position += dir1 * speed * Time.deltaTime; } if (Input.GetKey(KeyCode.A)) { PlayerTransform.transform.position += dir2 * speed * Time.deltaTime; } if (Input.GetKey(KeyCode.D)) { PlayerTransform.transform.position += -dir2 * speed * Time.deltaTime; } if (Input.GetKey(KeyCode.S)) { PlayerTransform.transform.position += -dir1 * speed * Time.deltaTime; } } } |
これでいい感じに角度が制限させると思います。
Unity初の記事はFPSゲームを作っていきたいと思います。
作業環境
参考にさせて頂いたサイト
① プロジェクトの作成。
3Dのプロジェクトとして新規プロジェクトをさくせいします。
②平面を配置
(0,0,0)に3dobjectのPlaneを配置します。
③Playerを作成
HierarchyにCreate emptyで空のGameObjectを作成します。
名前をPlayerにしタグをPlayerにします。
④CameraをPlayerの子オブジェクトに
⑤スクリプトの作成
以下のPlayerController.csを作成しMain Cameraにアタッチします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
//PlayerController.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { public GameObject Player; public GameObject Camera; public float speed; private Transform PlayerTransform; private Transform CameraTransform; // Use this for initialization void Start () { PlayerTransform = transform.parent; CameraTransform = GetComponent<Transform>(); } // Update is called once per frame void Update () { float X_Rotation = Input.GetAxis("Mouse X"); float Y_Rotation = Input.GetAxis("Mouse Y"); PlayerTransform.transform.Rotate(0, X_Rotation, 0); CameraTransform.transform.Rotate(-Y_Rotation, 0, 0); float angleDir = PlayerTransform.transform.eulerAngles.y * (Mathf.PI / 180.0f); Vector3 dir1 = new Vector3(Mathf.Sin(angleDir), 0, Mathf.Cos(angleDir)); Vector3 dir2 = new Vector3(-Mathf.Cos(angleDir), 0, Mathf.Sin(angleDir)); if (Input.GetKey(KeyCode.W)) { PlayerTransform.transform.position += dir1 * speed * Time.deltaTime; } if (Input.GetKey(KeyCode.A)) { PlayerTransform.transform.position += dir2 * speed * Time.deltaTime; } if (Input.GetKey(KeyCode.D)) { PlayerTransform.transform.position += -dir2 * speed * Time.deltaTime; } if (Input.GetKey(KeyCode.S)) { PlayerTransform.transform.position += -dir1 * speed * Time.deltaTime; } } } |
コンポーネントの設定は以下の様にしてください。
Speedは歩く速度なので調節してみてください。
すると、マウスでの視点操作、WASDで移動ができます。
さて、AngularJSが動作する環境を用意した次は実際にAngularJSを利用してHello Worldを表示してみましょう。
仕組みとしては
といった感じでしょうか。
なにはともあれコードを見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<!DOCTYPE html> <html ng-app="Test"> <head> <meta charset="UTF-8" /> <meta lang = "ja" /> <title>AngularJS_Hello World</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.1/angular.min.js"></script> <script> angular.module('myApp', []) .controller('Controller', function($scope) { $scope.msg = 'Hello World'; }); </script> </head> <body ng-controller="Controller"> {{msg}} </body> </html> |
AngularJSの機能はモジュールとメソッドという単位で実装していきます。
それでは早速AngularJSを書いていきましょう。
以下がAngularJSを導入したindex.htmlです。
1 2 3 4 5 6 7 8 9 10 11 |
<!DOCTYPE html> <html ng-app> <!-- AngularJSを使いますよ宣言 --> <head> <meta charset="UTF-8" /> <title>AngularJS_test</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.1/angular.min.js"></script><!-- AngularJSを配布サイトから読み込み --> </head> <body> {{6 + 8}} <!-- {{}}内の記述は<script>の外でもjavascriptの構文として扱うことができる! --> </body> </html> |
キモは <html ng-app> angular.min.jsの読み込み、そして{{}}内でJavascriptの処理が行える点でしょう。
では定番のHello Worldを表示してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!DOCTYPE html> <html ng-app> <head> <meta charset="UTF-8" /> <title>AngularJS_test</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.1/angular.min.js"></script> <script> </script> </head> <body> <div>{{doc="Hello World"}}</div> </body> </html> |
こんな感じで{{}}内にjavascriptを記述できます。
が、これではAngularJSを使ってHello Worldを表示したとは言えません。
あくまでAngularJSを導入してJavascriptをbody内に記述できるようにしてHello Worldを表示したにすぎませんよね。
それでは次回AngularJSを使ってHello Worldを表示してみましょう。
今回は3DオブジェクトにModifierを追加していきましょう。
Modifierとは非破壊で簡単にオブジェクトのディテールアップ、造形が行える機能のことです。
Modifierにもいろいろありますが今回はその全てに共通している基礎について説明します。
真ん中にキューブだけの簡単なシーンがあります。
まずmodifierを適応したいオブジェクトを右クリックで選択します。
Modify Generate Deform Simulate という列がありますが今回はGenerateのArrayを使ってみます。
Array をクリックするとModifier パネルにArray が追加されます。
するとなんか伸びましたか?
実はこれは伸びたのではなく並べられているのです。
試しにそのArrayの様々なプロパティをいじってみてください。
数が増えたり、xyzにオフセット(間隔)を持たせることが可能です。
そしてもう一つ、共通して重要なのはこれ
Apply :適応(破壊)
Copy :Modifierをコピーしてほかのオブジェクトにペーストできます。