「授業用」カテゴリーアーカイブ

敵と味方を見分けたり,敵のランクを区分ける「タグ」について

FPSなどのゲームをプレイしていると,味方を撃っても味方が死なないことがあります.つまりプレーヤーである兵士は,クーデター待遇改善要求はできない仕様になっています.ゲームの世界にまで社畜が浸透しています.

さて,この味方を撃っても影響が出ない件,Unityではこれをタグというシステムで実装します.

基本的なタグ(Player=自分,GameController=自分に影響を与えるもの)は用意されていますが,自作のタグを使用することもできます.

このタグ名が一致する,あるいは味方のタグ以外の場合において,ポイントを加算するということができます.

では実装してみましょう.

  1. まずタグを追加します.Sphereを選んで(タグを追加するだけなら,選ばなくてもいいのですが),,tag01
  2. InspectorのTagをプルダウンし,Add Tag…を選択します
  3. tag02
  4. +ボタンをクリックし,タグ名を追加します.今回はenemy1,2,3を追加しましたtag03
  5. タグを設定したいオブジェクト(敵)を選び,Tagをプルダウンし,enemy1やenemy2,3のどれかを選択します.他の敵オブジェクトにも同じ処理をしてください.
  6. tag04
  7. つづいて,スクリプトです.新規C#スクリプトを作成し,スクリプト名はhitcheckにし,全て下記に入れ替えてください.
using UnityEngine;
using System.Collections;

//use for UI
using UnityEngine.UI;

public class hitcheck : MonoBehaviour {

	//variable
	int countInt = 0;  //計算用に整数を使用する変数宣言
	public Text myText; //UnityUI内の文字を扱うための変数宣言
	string tagName; //タグ名を格納するための変数宣言

	void Start(){
		myText.text = "000"; //初期値を数字ではなく文字列として設定する
	}


	void OnTriggerEnter(Collider mycollider) { //トリガーに何か入ったらそのコライダを変数「mycollider」に格納する

		tagName = mycollider.tag; //mycolliderのタグ名をtagNameに入れる
		if (tagName == "enemy1") { //上でtagNameに入れたタグがenemy1と一致するなら
			countInt = countInt + 1; //countintに1を足す
		}else if (tagName == "enemy2") { //上でtagNameに入れたタグがenemy2と一致するなら
			countInt = countInt + 10; //countintに10を足す
		}else if (tagName == "enemy3") {
			countInt = countInt + 100;
		}



		Destroy(mycollider.gameObject); //mycolliderのゲームオブジェクトを消去する


		//sound

		//effect

		//add point
		//countInt++;
		//myText.text = countInt.ToString ();
	   myText.text = string.Format("{0:D3}", countInt);
	}

}

これでタグ(つまり当たった物)に応じて加算される点数を変えることができます.スクリプトの例はenemy1なら1点,enemy2なら10点,enemy3なら100点です.りんごにenemy1のタグを,みかんにenemy2のタグを指定すれば,りんごは1点,みかんは10点得ることができます.

これを応用すれば,味方に撃たれてもHP減らない!ってのができます.このタグの設定をプログラムを使って動的にで変更すれば,謀反も可能。下克上ですね.(違う)

プログラムのif文の中を変更すれば,同じタグの敵だけ消すなどということもできます.

Unity勉強会やるかも

やるかもしれません

たぶん,9月の前半です.

ゼミ,学年,学部不問.内容は入門の内容です.ゼミ落ちたかたも是非参加を.

私物のパソコンにUnityをインストールしてくることが参加の条件です.なおWindowsのバージョンによっては,日本語のユーザ名ではUnityがインストールできないことがあります.

フォルダ名やファイル名(特に業務用ソフトで使用する場合),ユーザ名は半角英数字で作成する習慣をつけましょう.

なお,ユーザ名を変更するといろいろ不都合が起きる場合もありますので,新規ユーザを作成することをおすすめします.

 

アニメーション出力(2)

レンダリング設定(参考)

  1. レンダー設定をクリックします
    ren9
  2. (A)動画を提出する場合
    Windows版の場合は以下のように設定します.イメージフォーマットはAVIに,圧縮をクリックし,圧縮プログラムはMicrosoft Video1に,フレームレンジは1〜200(このサンプルの場合)に(※この設定はOSの設定に応じて変更することがあります)
    ren16
    (B)連番画像を提出する場合
    図のように設定してください.
  3. イメージサイズプリセットHD1080に設定するren17
  4. (※)動画ファイルで書き出すのは一般的ではありません.通常は連番ファイル(連続した番号の静止画ファイル)で書き出す
  5. 使用するレンダラMayaソフトウェアに(レンダラーとは描画エンジンのこと.Pixarならレンダーマンを使い,最近の商用レンダラーはV-Rayが増えてきました)Mayaソフトウェアのタブを選択し,精度制作の精度エッジのアンチエイリアシング(境界線のギザギザ=ジャギーをぼかす度合い)を最高精度に,レイトレーシングの精度レイトレーシングにチェックをいれます
    ren8
  6. パースのビューで,ビュー>カメラ設定>解像度ゲート の設定に変更します
  7. ビューポートに白い枠が現れます.この枠にあわせてアングルを調整してください
  8. レンダリング開始ボタン(下図赤線)をクリックし,レンダリング結果を確認します
    ren11
  9. この場合は,静止画でレンダリングされます
  10. 照明が暗い場合は,照明を追加してくださいlight
  11. 身体が黒い場合には,テクスチャのリンクを再設定してください.rendertex1
  12. ライティングなどを調整し,レンダリングの状態をベストなものにします
  13. メニューセットレンダリングにし,メニューバー>レンダー>バッチレンダー を選択します
    ren12
  14. レンダリングが開始する
    ren13
  15. レンダリングが完了されたら以下のように表示されます.動画の保存場所はこのページ2のレンダー設定の共通のパスの部分にも記述されていますren14
  16. 動画を確認する

お疲れ様でした

アニメーション出力(1)

サイクルアニメーション

  1. 1〜36フレームの1サイクルの動きを繰り返し動作にしてみます
  2. 基本:グラフビューで繰り返したい動きを選び,カーブ>ポストインフィニティ>サイクル を選ぶ
    ren1ren2
  3. では,全体を選択します.Charactor1_Ctrl_Referenceを選び,メニューバー>選択>階層 で下の階層まで選択します
    ren3
  4. カーブ>ポストインフィニティ>サイクル でサイクルアニメーションにします
  5. アニメーションの再生範囲を200までに拡大ren4
  6. 再生して動くことを確認し

テストレンダー

  1. 再生ボタンを右クリックし,プレイブラストを選択ren5
  2. 動画プレイヤーが開き動画を確認できます(プレーヤーはOSによって異なります)ren6
  3. Previs(Previsualization)プレビズあるいはプリビズとも呼ばれ,時間のかかるレンダリングをしないで,簡易動画によって動きの確認や,他のカットと組み合わせて映像編集の状態をチェックするというもの
  4. これはテストレンダーで,正規のレンダリングではありませんが,こうしてテスト版を作成し動きをチェックした後,本番レンダリングとなる

つづく

UGUI基本(4)

UGUIでボタンを作成する例

  1. 次のような画像を用意しますbutton1
  2. 画像を読み込み,Texture TypeはSpriteに,SpriteModeはMultipleにし,Applyをクリックし適用.
  3. その後SpriteEditorを開き,ドラッグして使用エリアを指定します.今回は真ん中で4分割指定しますbutton2
  4. 1枚の画像から4つのイメージを別々に使用できるようになりました.メモリの節約になるとか.button4
  5. メニューバー>GameObject>UI>Button を選択します
  6. 位置を調整し,幅と高さをSpriteのものを同じにします
  7. Source Imageには押される前のボタン画像を
  8. PressedImageには押された画像を指定しますbutton5
  9. 以下,動作例です

UGUI基本(3)

UGUIその3

  1. 作成したテキストの背景(映像の世界では座布団と呼んだりします)を設定します
  2. 画像をAssetにドロップし,選択します
  3. Texture TypeをSpriteにし,Applyをクリックしますuimage4
  4. メニューバー>GameObject>UI>Image で画像が入るUI要素を追加します(ヒエラルキーにImageが追加されます)uimage3
  5. Imageの設定を下図のようにしますuiImage
  6. ImageのSource Imageを読み込みます
  7. uimage5
  8. 文字要素(counthyouji)をImageの子にします
  9. 位置調整してできあがりuiimage2

 

 

 

UGUI基本(2)

ゼロ埋めをする

  1. 前エントリーのスクリプトに,少し手を加えるだけでゼロ埋めをすることができます.
  2. ゼロ埋めは桁数をそろえて見た目の良さを向上させるだけでなく,どの程度得点をとればよいか,そのモチベーションを発生させることにつながります.
  3. 以下はスクリプトです.変更箇所は黄色になっています.15行目は初期設定.29行目はコメントアウトしています.30行目はstring(文字列).format(の設定でフォーマットは)(”{0:D3}”3桁をゼロで,countIntを変換しなさい)の意味です
using UnityEngine;
using System.Collections;

//use for UI
using UnityEngine.UI;

public class hitcheck : MonoBehaviour {

	//variable
	int countInt = 0;  //
	public Text myText; //use for UI text


	void Start(){
		myText.text = "000";
	}


	void OnTriggerEnter(Collider mycollider) {
		Destroy(mycollider.gameObject);


		//sound

		//effect

		//add point
		countInt++;
		//myText.text = countInt.ToString ();
		myText.text = string.Format("{0:D3}", countInt);
	}

}

実行結果zeroume

UGUI基本(1)

Colliderのつづきです.今回はUIを表示します.

 

  1. メニューバー>GameObject>UI>Text を選択します
  2. HierarchyにCanvasとTextが追加されましたunity3
  3. CanvasはUnityのUI用の入れ物です.他のUi要素はこのCanvas下に入れます.複数のCanvasを設置することも可能ですが,特段の事情が無い限り1つにしておいてください
  4. Hierarchyからcanvasを選択し,Canvas Scaler(無ければメニューバー>Component>Canvas Scaler で追加),Reference ResolutionのXを1920,Yを1200にするunityi2
  5. Reference Pixel Per Unitを100に(画像は233になっていますが気にしない)
  6. Textの名前を変更します.この例ではcounthyoujiにし,RectTransform Anchor Presetを左上固定(下画像と同じに)にし,Posxを360,PosYを-100,Widthを600に,Heightを120にしますunityui
  7. 前回のスクリプトを以下に変更します.黄色い部分が変更箇所です
  8. using UnityEngine;
    using System.Collections;
    
    //use for UI
    using UnityEngine.UI;
    
    public class hitcheck : MonoBehaviour {
    
    	//variable
    	int countInt = 0;  //
    	public Text myText; //use for UI text
    
    
    	void Start(){
    		myText.text = "0";
    	}
    
    
    	void OnTriggerEnter(Collider mycollider) {
    		Destroy(mycollider.gameObject);
    
    
    		//sound
    
    		//effect
    
    		//add point
    		countInt++;
    		myText.text = countInt.ToString ();
    	}
    
    }
  9. 注意する必要があるのは,「数字(int)」と「文字列(string)」の扱いです.UIには数字を表示させることができませんので,29行目の.ToString()で数字を文字に変換しています
  10. スクリプトの説明は以下のとおりscriptsetumei
  11. 実行動画です,スタートすると数値が初期化されゼロになり,Cubeが当たると数字が1増えます

    おつかれさまでした

Collider基本(4)

PlayMakerをつかって,お掃除ゲームを作ってみましょう.

まずはCubeが当たると消えるプログラム.これはさきほどのと一緒.

つぎに,マウスの座標を検出し,マウスをクリックしている間は常にそのX,Z座標でYは1固定で移動させなさい.と設定.

マウスを放したら,離した位置で高さ3に戻します

そして,ランダム座標を生成し,ボールを作成.変数に1を足して,それが30より多いか少ないか比較させ少ないともう1回ボールを作成し,変数に1足す.多いと何もないところへ遷移しアクションがないのでなにも動作しない.

そんなプログラムです.

マウスをクリックするとCubeが低くなり,マウスを放すとCubeの位置が高くなります.

Collider 基本(3)

では,せっかくなのでPlayMakerでやってみましょう.

スクリプトを外したCubeにPlayMakerで同じ動作を組み込んでいきます

同じ物がプログラミングしなくても約1分30秒で作成できます.作成過程で変数を作成(動画の44秒付近,New variable…)していますが,この部分,プログラミングでは

	void OnTriggerEnter(Collider mycollider) {

Collider(これは変数の型) mycollider(変数名)です.こういう関数に渡す変数のことを引数(ひきすう)とか言うそうですが,さっぱり分かりません.だいたい引とか言いながらどこにも数字なんか出てきません

なんでこんな呼称にするかな,,,

市役所に行くと,建設当初からあった窓口OnTriggerEnter課があり,そこで受け付けてもらえる申請書の書式はColliderという種類で,その申請書にmycolliderと書いていると.すると,OnTriggerEnter課の職員はColliderの申請書に書いてあるmycolliderを探し,destroyすると,,,,それが下のコード

Destroy(mycollider.gameObject);

まぁ引数とは,役所の窓口に出す申請書的なものではないかと,,,

たぶんこの○○課のことをメソッドとか言うんでしょうが,そんなことは知らなくてもとりあえずは動く.