今回作るゲーム
移動やジャンプをして、ゴールを目指すシンプルなアクションゲームです
今回やること
- プレイヤーの移動
- プレイヤーのジャンプ
- アイテムを配置する
- 制限時間を作る
パッケージのダウンロード
こちらよりパッケージをダウンロードしてプロジェクトに入れて下さい
一応元データも載せておきます
プロジェクトの入れ方はこちら
プレイヤーの移動の作成
プレイヤーの移動のプログラミング
C#の基本的なルールと構造の説明
C#にはいくつかルールがあります。
②何をどこに入力するのかエリアを理解する
③エリアとエリアは{}でとじる
④行の最後は;をつける
以上の点をしっかりおさえておきましょう!
スクリプトの作成
Create → C#Scriptをおします
スクリプトの名前はPlayerにします
プレイヤーの移動は
WS:前進後退、AD:方向転換、スペース:ジャンプにします
早速、Assets → ScriptsにあるPlayerスクリプトをダブルクリックして開きます
コードの入力
では実際に、コードを書いていきましょう。
Scratchで表すと、
というコードを打っていきます
表はこちらにあります。
❶このブロックは「ずっと」ではさまれているので、ゲーム開始後ずっと実行するエリア」に入力します。
❷「もし~なら」を入力していきます。表を見てみると、
if(getabako == 1){}
となっています。条件は違うので()の中は空欄にし、
if(){}
と入力しましょう。
❸条件は「Wキーが押されたら」です。
Input.GetKey(KeyCode.W)
なので、if(){}の()の中にいれます。
if(Input.GetKey(KeyCode.W)){}
となります。
④実行する内容は「10歩動かす」です。
transform.position += transform.TransformDirection(Vector3.forward * 10);
となっているので、
if(Input.GetKey(KeyCode.W))){}
の{}の中に、
transform.position += transform.TransformDirection(Vector3.forward * 10);
をいれます。
if(Input.GetKey(KeyCode.W)){
transform.position += transform.TransformDirection(Vector3.forward * 10);
}
となりました。
画面がこんな風になっていれば正解です。
入力したら、Unityに戻り、Playerスクリプトをプレイヤーにドラッグ&ドロップします
テストプレイをしてWキーをおしてみると…
早すぎて全部突き抜けていきましたね
なので、10の後に「 * Time.deltaTime」を追加で入力しましょう
Time.deltaTimeとは?
これを移動の後に入力すると処理の速度が一定になり、ちょうどいい感じになる
同様に他のブロックも入力してみましょう。
○度回すは
transform.Rotate(new Vector3(0, 15, 0));
です
入力したら答え合わせしましょう
再生ボタンを押してエラーがないか、確認しましょう。
プレイヤーの重力処理とジャンプの作成
UnityではRigidbodyというものがあり、これをつけると自動で重力がかかるようになります
まずはRigidbodyをつけ、その後、ジャンプのプログラミングをしていきます
プレイヤーを選択し、AddComponentをおし、検索欄に「ri」と入力し、Rigidbodyを選択します
Contraintsの横の▶︎をおし、FreezeRotationのチェックを全ていれます
画像のような内容のスクリプトを入力するのですが、少し難しい内容になります
以下のスクリプトをそのまま打ちましょう
説明については、コメントで記入してありますので、参考にしてください
入力するスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
private Rigidbody rb;// Rigidbodyの機能を使うためにrigidbodyという変数を作成
private bool Grounded;// 地面についているかどうか
// Use this for initialization
void Start()
{
rb = GetComponent<Rigidbody>();// rbにRigidbodyを代入する
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.W))// Wキーがおされたら
{
transform.position += transform.TransformDirection(Vector3.forward * 10 * Time.deltaTime);// 前方に10 * 時間経過分動かす
}
if (Input.GetKey(KeyCode.S))// Sキーがおされたら
{
transform.position += transform.TransformDirection(Vector3.forward * -10 * Time.deltaTime);// 後方に10 * 時間経過分動かす
}
if (Input.GetKey(KeyCode.A))// Aキーがおされたら
{
transform.Rotate(new Vector3(0, -5, 0));//左回転する
}
if (Input.GetKey(KeyCode.D))// Dキーがおされたら
{
transform.Rotate(new Vector3(0, 5, 0));//右回転する
}
if (Grounded == true)// もし、地面に触れていたら、
{
if (Input.GetKey(KeyCode.Space))// もし、スペースキーがおされたら、
{
Grounded = false;// 地面に触れてないことにする
rb.AddForce(Vector3.up * 400);// ジャンプする
}
}
}
void OnCollisionEnter(Collision other)// 地面に触れた時の処理
{
if (other.gameObject.tag == "Ground")// もしGroundというタグがついたオブジェクトに触れたら、
{
Grounded = true;// 地面に触れたことにする
}
}
}
変数の説明
コードを見てみるとrbやGroundedという変数が使われています
変数についてはUnityでは沢山の種類があるので、詳しくは以下を参考にして下さい
#C#での変数の作り方
①図を参考にして変数を入力していきます。
②変数はアクセス修飾子 型 変数名;と入力します。
アクセス修飾子については以下を参考にして下さい。
型については以下を参考にして下さい。
例えば他のオブジェクトでも使用可能なfloat型のgetabakoという変数を作る場合
public float getabako;
と入力します。
Rigidbodyなどのコンポーネントをプログラミングで使えるようにする
基本的にはどのコンポーネントもルールは同じです
①変数の部分に
private Rigidbody rb;
というようにprivate “コンポーネントの名前” “変数の名前”を入力します
②void Start(){}の中に
rb = GetComponent<Rigidbody>();
を入力する
③命令を実行する箇所に任意の命令を入れる
rb.AddForce(Vector3.up * 400);
今回はAddforceというRigidbodyに力をかける命令を与えています
物に触れた時の説明
①衝突処理を入力する箇所に入力します
②触れた時の処理は
void OnCollisionEnter(Collision other){}
の{}の中に記述します
③触れたオブジェクトが何かはオブジェクトの名前、またはオブジェクトについているタグで判断します
if (other.gameObject.tag == "Ground")
今回はGroundというタグがついていたら処理が実行されるようになっています
※タグは今回のチュートリアルでは予めつけてあります
テストプレイをしてみると
スペースキーでジャンプができるので、ゴールを目指しましょう
カメラがプレイヤーについていくようにする
MainCameraをプレイヤーにドラッグ&ドロップします
そうするとカメラがプレイヤーの子オブジェクトになり、プレイヤーについていくようになります
アイテムを配置する
Item → Prefabsにあるアイテムをドラッグ&ドロップします
座標を調整します。xは0、yとzは取りやすい位置にするのがオススメです
いっぱい置いてステージを豪華にしましょう。
お疲れ様でした♪
コメント