2014年01月17日

マイマニュアル2 Unity3D(code:C#)

 自分用の備忘録です。(言語はC#)


  カメラがターゲットを追随させるようにする

--------------------------

オブジェクト(Player)を矢印キーで動かせるようにする(2Dロケット編)
 Playerの動ける範囲を限定するスクリプトも含まれる↑

  ライティングの基礎(3点ライティング

  弾(ミサイルなど)を発射するシステムを作る(弾作成)

  弾(ミサイルなど)を発射するシステムを作る2(発射システム)

  弾(ミサイルなど)を発射するシステムを作る3(弾消去)

  敵を作る(爆発)

---------------------
ラベル:Unity3d
posted by Shindo Izo at 11:45| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年02月12日

GUI Button を使う(C#)

 自分用の覚え書きです。

<終了ボタンとリスタートボタンを作る>
 終了ボタンは2DTextureを使い、リスタートボタンはGUI.Buttonを使いました。それらを四角のボックスで囲んでいます。
 もうひとつ同じものを画面右下に作っています。その場合、座標指定は、Screen.widthとScreen.heightを使うと便利です。
 下図は、Cubeが落ちるプログラム
1guibuttondessei.jpg

<手順>
 1.Empty GameObject作成後、GUI_Buttonsとリネーム&リセット。
 2.Add Componentから、GuiButtons.cs作成
 3.適当に作っておいた2DテクスチャーをIconにドロップ
2guibuttonsousane.jpg

<スクリプトの内容>

using UnityEngine;
using System.Collections;

//GUI Button を使う
public class GuiButtons : MonoBehaviour {

public Texture2D icon; //ボタンアイコン用2D画像

void OnGUI() {
//画面の左上にメニューを作る
GUI.Box (new Rect(10,10,100,90),"MENU");

if (GUI.Button(new Rect(30, 35, 60, 30), icon))
{
Application.Quit (); //アプリ終了
}
if (GUI.Button(new Rect(30,65, 60, 30), "Restart"))
{
Application.LoadLevel (Application.loadedLevel); //同じレベルを最初から
}

//画面の右下にメニューを作る
GUI.Box (new Rect(Screen.width - 110,Screen.height - 100,100,90),"MENU");

if (GUI.Button(new Rect(Screen.width - 90, Screen.height - 75, 60, 30), icon))
{
Application.Quit (); //アプリ終了
}
if (GUI.Button(new Rect(Screen.width - 90,Screen.height - 45, 60, 30), "Restart"))
{
Application.LoadLevel (Application.loadedLevel); //同じレベルを最初から
}
}
}

-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 18:03| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年02月13日

次の処理の前に時間待ちを入れる(unityC#)

 自分用の覚え書きです。

 次の処理の前にプレイヤーに時間待ちをさせるにはどうしたらいいか…。例えば、現在のレベルをクリアーして次のレベルに行く時、しばらくの時間クリアーと表示したい場合など。

 Invoke("呼び出す関数名",時間)

というコマンドが良さそうです。(時間は秒です)

void Update ()
{
  //省略
  //....
  //クリアーしたら、2秒後にLoadingLevel()に飛ぶ  
  if (clear)
  {
    Invoke("LoadingLevel", 2);
  }
}

void LoadingLevel ()
{
  Application.LoadLevel (level);
}

 ゲームオーバー画面などにも、メニュー画面に飛ぶ前に3秒入れるとか、に使えそうです。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 21:26| Comment(2) | Unity3D マイマニュアル | 更新情報をチェックする

2014年02月14日

スコア、ハイスコアの保持(unityC#)

 自分用の覚え書きです。

 スコアやハイスコアを定義しても、シーンが変わるごとに初期化されてしまいます。そういうゲームならいいのですが、スコアをシーンを通して加算していく場合はダメです。
 色々考えたあげく、次の方法に落ち着きました。

<スコアを初期化させないようにする>
 スコアを処理するスクリプト(PlayerController.csなど)で、最初に、

 public static int score;

と宣言すると、シーンが変わっても初期化されません。ハイスコアも同じです。
 途中でリスタートしたり、ゲームオーバーになった場合は、スコアだけ初期化するスクリプト(score = 0;)を最初のシーンにだけ追加しておけば、スコアは0から始まり、ハイスコアはそのままですのでOKです。ハイスコアはプログラムが終了するまで保持されます。

 以上は自己流ですので、参考程度ということでお願いします。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 12:10| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年02月15日

プレイヤー落下処理(unityC#)

 自分用の覚え書きです。

 プレイヤーがステージから落下した時、ゲームオーバーとし、指定したシーンからロードし直すようにしたい場合の方法です。 
 下の例は、ボール(プレイヤー)が落下してBox Colliderで検知して、ゲームオーバーと表示。指定秒後に最初から始まる、という設定です。

<落下検知用Box Colliderを用意する>
 1.Sphere作成、Playerとリネーム&リセット
 2.GUI Text作成、GameOver Textとリネーム&リセット後、適当な位置に移動
 3.Empty Object作成、Fall Outとリネーム&リセット。
 4.Fall OutのTransform設定(大きくして、下に下げた)
 5.Box ColliderのIs triggerにチェックを入れる
 6.Mesh Rendererのチェックを外すか、消去
 7.Add Compornentから、FallOutCatch.cs追加
1falloutcatchdesu.jpg

<FallOutCatch.csの内容>

using UnityEngine;
using System.Collections;

public class FallOutCatch : MonoBehaviour {

void OnTriggerExit(Collider other)
{
//Destroy(other.gameObject);//Player消去の場合
GameController.gameover = true; //ゲームオーバー
}
}

<ゲームオーバー表示とリスタートシステム作り>
 1.Empty Object作成後、リネーム&リセット
 2.Add Compornentから、GameController.cs追加
 3.GameOver TextをGameover Textにドロップ
2gameconttexttuki.jpg

<GameController.csの内容>

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour {

public GUIText gameoverText; //ゲームオーバーテキスト
public static bool gameover; //ゲームオーバー判定用

void Start ()
{
gameoverText.text = ""; //←(初期化)必要!
gameover = false; //ゲームオーバーでない
}

void Update ()
{
//もしゲームオーバーなら
if (gameover)
{
gameoverText.text = "GAME OVER!"; //テキスト表示
Invoke("Restart", 5); //5秒後にRestart() 実行
print (""); //コンソールテキスト消去
}
}

//リスタート
void Restart ()
{
print ("Reload & Start!"); //コンソールにテキスト表示
Application.LoadLevel (Application.loadedLevel); //最後にロードしたシーンをリロード
}
}

 以上は自己流ですので、参考程度ということでお願いします。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 17:50| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年03月07日

データのセーブとロード(unityC#)

 自分用の覚え書きです。

 プレイヤーが途中でゲームを止めたときに、その時点でのデータをセーブし、次回始めたとき続きからできるようにする方法です。こちらのサイト様を参考にさせてもらいました(というか、おんぶに抱っこですが)

 データはint,float,stringでできるようです。

<スクリプト>
 Empty Object(GameController)に以下のスクリプトをドロップします。
 レベルはプレイヤーが現在プレイしているレベルを変数に入れるようにすればOKかと思います。(下の例はStart()に入れているので保存する意味はないと思います)

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour {
public int money  = 0;
public float timer = 0;
public string level;

void Awake ()
{
money = PlayerPrefs.GetInt("money");
timer = PlayerPrefs.GetFloat("timer");
level = PlayerPrefs.GetString("level");
}

void Start ()
{
level = "Level1";
PlayerPrefs.SetString("level",level);
}

void Update ()
{
timer += Time.deltaTime;
PlayerPrefs.SetFloat("timer",timer);
}

void OnGUI ()
{
if (GUI.Button(new Rect(5, 5, 100, 50), "+ 10$")) {
money +=10;
PlayerPrefs.SetInt("money", money);
}
if (GUI.Button(new Rect(5, 60, 100, 50), "Data Clear")) {
money = 0;
timer = 0;
PlayerPrefs.DeleteKey("money");
PlayerPrefs.DeleteKey("timer");
}
GUI.Label(new Rect(5, Screen.height/2 - 20, Screen.width-10, 50), "Level : "+level);
GUI.Label(new Rect(5, Screen.height/2 , Screen.width-10, 50), "Money : "+money + " $");
GUI.Label(new Rect(5, Screen.height/2+ 20, Screen.width-10, 50), "Time : "+timer);
}
}

<実行結果>
 +10$を押すと10$ずつ加算され、Data Clearを押すと、タイマーとお金がリセットされます。自動的に終了時点のデータが保存され、再開するとデータがロードされて続きから始められます。
1datahozondesu.jpg

<コマンドのことなど>
・ロード
 money = PlayerPrefs.GetInt("money");
 timer = PlayerPrefs.GetFloat("timer");
 level = PlayerPrefs.GetString("level");
・セーブ
 PlayerPrefs.SetInt("money", money);
 PlayerPrefs.SetFloat("timer",timer);
 PlayerPrefs.SetString("level",level);
・データクリアー
 PlayerPrefs.DeleteKey("money");

-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 17:38| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年03月26日

簡単なフェードイン(Unity C#)

 自分用の覚え書きです。

 場面の転換で、いきなり違う場面に変わると見ている側にはどうも変に感じます。そういうとき使われるのがお馴染みのフェードイン、フェードアウト。
 そこで、簡単にフェードインやフェードアウトをできないものか考えてみました。
 思いついたのが、ライトの強度を変える、というもの。

<フェードインのスクリプト>

using UnityEngine;
using System.Collections;

public class LightController : MonoBehaviour {
public float lastStrong; //求めるライト強度(0.0〜8.0)
private float lightStrong; //現在ライト強度
public float fadeSpeed; //フェードのスピード

void Start () {
light.intensity = 0.0f;
}

void Update () {
if(lightStrong <= lastStrong)
{
lightStrong += Time.deltaTime * fadeSpeed;
light.intensity = lightStrong;
}

}
}

 上のスクリプトをライトにドロップすればフェードインします。フェードアウトの場合は逆のスクリプトを作ればOKです。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 18:14| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年04月02日

2台目のカメラ使用 unity3D

 自分用の覚え書きです。

 2台目のカメラがほしい場合があります。例えば:

 ・プレイヤーの居るマップを表示したい
 ・レーダーのようなものを表示したい
 ・車のバックミラーを表示したい

等。

<舞台設定>
 1.3つのCubeと一つのSphereを設置(敵と味方という設定)
 2.Add LayerでMikataTekiを作る
 3.それぞれのレイヤーをMikataTekiに設定
1Layersetteidesu.jpg

<2台目のカメラの設定>
 1.2台目のカメラを設置
 2.カメラを俯瞰にする
 3.Curling MaskをMikatatekiだけにする
 4.Viewport Rectで画面表示の位置と大きさ指定
 5.Depthで手前に表示するように設定
  数字が大きいほど上に表示される。図の場合、MainCameraが-1に設定されているのでデフォルト
2camerasetteidesu.jpg

<プレイ画面>
3raderhuu.jpg

 レイヤーを指定することによって必要なものだけ表示できます。デフォルトだと全部表示されます。
 上のカメラをPlayerにドロップすれば、プレイヤーの動きに追随して表示することができるはずです。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
posted by Shindo Izo at 13:48| Comment(0) | Unity3D マイマニュアル | 更新情報をチェックする

2014年06月08日

ドアの開閉 (Unity C#)

 自分用の覚え書きです。

 今までドアの開閉はなしでやってましたが(Colliderを削除してました)、ドアの開閉ぐらい何とかなるだろうとやってみました。が、以外と難しく四苦八苦。アニメーションにしようと思ったのですがどうもうまく行きませんでした。
 結局、自己流のスクリプトで強引にやりました。

<ドア開閉システムを作る>
 1.Cubeでドアを作り(Collider削除)、それをEmptyObjectの入れ子にする。
 2.CenterをPivotにチェンジして、ドアの端に回転軸が来るように調整
 3.Box Colliderをくっつけ、Is Triggerにチェック。Box Colliderは少し大きめ。
 4.ドア開閉するスクリプトをくっつける。ドア回転スピード50。
1doormakingdesu.jpg

<スクリプト>

using UnityEngine;
using System.Collections;

public class DoorController : MonoBehaviour {
public float openSpeed; //ドアオープンスピード
private bool doorOpen; //ドアチェック
private float yDegree; //ドア回転角

void Start()
{
  doorOpen = false;
  yDegree = 0.0F;
}
void Update()
{
  if (doorOpen)
  {
    if (yDegree<90.0F)
    {
      yDegree += openSpeed * Time.deltaTime;
      transform.Rotate (0,openSpeed * Time.deltaTime,0);
    }
  }
  else
  {
    if (yDegree> 0.0F)
    {
      yDegree -= openSpeed * Time.deltaTime;
      transform.Rotate (0,-openSpeed * Time.deltaTime,0);
    }
  }
}

void OnTriggerEnter(Collider other)
{
  doorOpen =true;
}
void OnTriggerExit(Collider other)
{
  doorOpen = false;
}
}

 上のやり方の欠点は、プレイヤーの位置によって少し変な動き(開閉を繰り返す)をする場合がありますが、Colliderを大きめにしておくとほぼ問題なく動作しました。
-----------------
 <ご注意>私自身が全くの超初心者ですので、文中まちがいがあるかも知れません。その際はご容赦をお願いします。<(_ _)>
ラベル:Unity3d
posted by Shindo Izo at 17:35| Comment(2) | Unity3D マイマニュアル | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。