課題
(1)簡単な一人テニスゲームを作ってみましょう。
(2)(↑がうまくいったら)ジャンプゲームを作ってみましょう
(3)(↑がうまくいったら)ボールをクリックしたらジャンプするように変えてみましょう。
(4)(余力があったら)ゲームをより改良するか、学んだ技術を使って何か面白いものを作ってみましょう。
作ったC#のプログラムを添付してください。
(プロジェクトを保存したフォルダのasset以下にあると思います。
コメント欄には、どこまでやったかと、ジャンプゲームがうまく動いた人はハイスコア書いてください。
- 新規プロジェクトを作る(「2D」プロジェクトを選びましょう)
- Asset→Create→Folderを選んで、Asset内に新規フォルダを作成
- 名前が変えられるようになっているでresと名付けます。
- resをダブルクリックして開きます。
- DLしたサンプル画像ファイルを開いた場所(ProjectView内)にドラッグ&ドロップします。
- →画像がプロジェクトで使えるようになります。
- BGをクリックして、Scene窓にドラッグ&ドロップします。
- →BGがHierarchy窓に追加されます。(GameObject→2DOcject→Spriteを選択して新しいSpriteを作った後「BG」に改名し、Inspector窓のSpriteの欄にアセット窓から画像BGをドラッグ&ドロップする操作でも、同様の結果になります)
- 場所を調整しましょう(Positionをx=0,y=0に)
- 描画優先度を調整しましょう(Order in Layerを-1に。数値が大きいほど手前に描かれます。背景なので優先度を下げ、常に一番奥に表示されるようにします)
- Hierarchy窓のMainCameraをダブルクリックします。
- Inspector窓のCameraの5行目にあるSizeの値を2.4にします。(Scene窓で白い枠をドラッグする操作でもSizeは変更できます)
- →ゲーム画面内で背景が大きく表示されるようになります。
- Project窓のYellowBallをクリックしてScene窓にドラッグ&ドロップします
- →YellowBallもHerarchy窓に追加されます。
- 場所を中央の少し左上に調整しましょう(Positionをx=-1.2,y=0.8に)
- Project窓のBlockをクリックしてScene窓にドラッグ&ドロップします
- →BlockもHerarchy窓に追加されます。
- 場所を画面の下の方に調整しましょう(Positionをx=0,y=-2.2に)
- Scaleを変更して横長にしましょう。(Scaleをx=3に)
- Colorをクリックして、青くしましょう。(RGBを0,0,255に。数値を入力せずに画面から青っぽい部分を選ぶ操作でも構いません)
- →Blockが青くなります。(元の画像に色が付いている場合は、掛け合わせた色になります)
- Herarchy窓のBlockを右クリックしてrenameを選択して、名前をRacketに変えてあげましょう(Block選択中に再度クリックする操作でも名前変更できます)
- 今度は左右と上の壁を作ります。
- Project窓のBlockをクリックしてScene窓にドラッグ&ドロップします
- 3回繰り返すかHierarchy窓でコピペを駆使して、3種類作りましょう
- Positionをx=-3.3,y=0に、Scaleのy=16に、名前をWallLeftに
- Positionをx=3.3,y=0に、Scaleのy=16に、名前をWallRightに
- Positionをx=0,y=2.56に、Scaleのx=21.6に、名前をWallTopに
- 配置としては以上です。それぞれの属性などを設定します。
- YellowBallを選んでInspector窓のAddCoomponentをクリックし、Phisics2D→Rigibody2Dを追加します。(物理挙動の機能を追加)
- Inspector窓のGravity Scaleを0にします。(重力の影響をなくす)
- さらにAddComponentをクリックし、Phisics2D→CircleCollider2Dを追加します。(あたり判定を追加)
- Project窓がresを開いている状態なので、AssetをクリックしてAssetを開いている状態にします。(中にはresが入ってます)
- Assets→Create→Phisics2DMaterialを選ぶと、New Phisics2DMaterialが生成されます。
- Friction(摩擦係数)を0に、Bounciness(跳ね返り係数)を1にします。
- YellowBallのInspector窓で、CircleCollider2DのMaterialの欄に、作ったNew Phisics2DMaterialをドラッグアンドドロップします。
- Racketを選んでInspector窓のAddComponentをクリックし、Phisics2D→BoxCollider2Dを追加します。(あたり判定を追加)
- Materialの欄に、Project窓からNew Phisics2DMaterialをドラッグ&ドロップします。
- WallRightとWallLeftとWallTopにもBoxCollider2Dを追加して、Materialも設定します。
- Assets→Create→C# ScriptでScriptを作り、YellowBallと改名します。
- ダブルクリックしてエディタを起動し、8行目(Start()の中)に1行足します。
transform.GetComponent<Rigidbody2D> ().AddForce (new Vector2 (100, -100));
//<>は打ち込んでから半角に置き換えてください。
- 保存してUnityの画面に戻ります。
- Hierarchy窓でYellowBallを選んで、inspector窓に作ったスクリプトYellowBallをドラッグ&ドロップします。
- Assets→Create→C# ScriptでScriptを作り、Racketと改名します。
- ダブルクリックしてエディタを起動し、13行目(Update()の中)に12行足します。
if (Input.GetKey (KeyCode.RightArrow)) {
transform.Translate (transform.right *0.1f);
}
if (Input.GetKey (KeyCode.LeftArrow)) {
transform.Translate (transform.right *-0.1f);
}
if (Input.GetKey (KeyCode.UpArrow)) {
transform.Translate (transform.up*0.1f);
}
if (Input.GetKey (KeyCode.DownArrow)) {
transform.Translate (transform.up *-0.1f);
}
- 保存してUnityの画面に戻ります。
- Hierarchy窓でRacketを選んで、inspector窓に作ったスクリプトRacketをドラッグ&ドロップします。
- 実行してみましょう。
- 課題1がうまくいったら課題2に移りましょう。
- Blockの画像5回、画面内にドラッグ&ドロップしましょう。
- 座標を調整します。xyそれぞれ(-2.2 , -2.2)(-1.2 , -2.2)(1.2 , -2.2)(2.2 , -2.2)(0 , -0.2)
- AddComponentでPhisics2D→BoxCollider2Dを足しましょう。(足してからコピペして座標調整した方が早いかもしれません)
- Racketからスクリプトを外します。(歯車を選んでクリック→Remove Componentを選択)(操作できなくします)
- Project窓のNew Physics2D Materialのbounsiness(跳ね返り係数)を0にしてあげます
- YellowBallのInspector窓で、GravityScaleを1にして、FixedAngleにチェックを入れます。(FixedAngleが見当たらない時は、ConstraintsのFreeze Rotation Zにチェックを入れます)
- YellowBallのスクリプトに下記を追加します。
//3行目に↓を追加
using UnityEngine.UI;
//6行目(class入ってすぐ)に5行追加
public Text t;
int score=0;
float time=30.0f;
int jumpcount = 0;
const int MAX_JUMP_COUNT = 2;
//Start()に入れた1行(AddForceで初速を与える行)をコメントアウト
//Update内に下記を足す。
time -= Time.deltaTime;
if (time >= 0.0f) {
t.text = string.Format ("score:{0} time:{1:f1}", score, time);
} else {
t.text = string.Format ("score:{0} finished!", score);
}
if (Input.GetKey (KeyCode.RightArrow)) {
transform.Translate (transform.right *0.05f);
}
if (Input.GetKey (KeyCode.LeftArrow)) {
transform.Translate (transform.right *-0.05f);
}
if (Input.GetKeyDown (KeyCode.Space) && jumpcount < MAX_JUMP_COUNT) {
transform.GetComponent<Rigidbody2D> ().velocity = new Vector3 (0, 5, 0);
//<>は打ち込んでから半角に置き換えてください。
jumpcount++;
}
//Updateが終わった後、classが終わる}の前に下記を足す。
void OnCollisionEnter2D(Collision2D collision){
if (collision.gameObject.name == "RedBall" ||collision.gameObject.name == "RedBall 1") {
collision.gameObject.transform.position = new Vector3 ((Random.value - 0.5f) * 6.0f, Random.value * 2.0f, 0);
if (time >= 0.0f) {
score++;
}
}
jumpcount = 0;
}
- RedBallを2回ドラッグ&ドロップします。
- x,yは( -2.2 , 1.1 )と( 2.2 , 1.1 )にします
- AddComponentでCircle collider2dを足します
- GameObject→UI→Textでテキストを生成
- x,yは( 0,0 )にします。
- YellowBallのScriptの変数Tの欄にTextをドラッグ&ドロップします。
- 実行してみましょう
- 左右キーで移動、スペースキーでジャンプします。
- ジャンプ中に1回だけジャンプできます。
- (厳密には、玉がオブジェクトに接触してから2回ジャンプできます)
- (赤い玉を取った後など、再度ジャンプ可能です)
- 赤い玉を取ると1点入り、赤い玉がワープします。
- 30秒で取れる玉の数を競うゲームです。
- 問題なければ次の課題に
- YellowBallのスクリプトに下記を追加します。
//classの終わりの}の前に、下記3行を追加
void OnMouseDown(){
transform.GetComponent<Rigidbody2D> ().velocity = new Vector3(0,5,0);
}
//<>は打ち込んでから半角に置き換えてください。
- セーブして実行してみましょう。ボールをクリックすると弾が跳ねるようになります。