2014年12月1日月曜日

ボールの個数を増やす その1

ボールの個数を増やす話。とりあえずあのバグは後。課題もやりつつ、バグ修正もしつつって感じ。

  • オプションでボールの個数を変更可能
  • Startの上にボールボタン配置
  • 押すとStart地点・戻ってこないようにする板の近くにボールが出てくる
  • 万が一、一回以上Start済みのボールがStartゾーンに戻ってきて未Startボールに当たった場合、未Startボールのほうが削除・補充される。そしてまた発射できるようになる
  • 複数個ボールを出して発射した場合、それぞれのボールに同時に同じ威力の力ではなく、それぞれのボールに同時に違う威力の力が与えられる
  • なお、発射台にないボールに関しては力を与えない
  • 壁を作成し、コリントから外れていった玉はそこをさまよっている
  • 壁の上には透明の壁を配置させて、外に出ないようにする
  • 万が一、壁を抜けて落下したボールに関しては、削除される
  • 複数個ボールを出しResetした場合、ボールの残り個数カウンターが初期設定値に戻る、場に出ているボールが全て削除
これらを実現するには、「引っ張って打つ機構」のような「物がボールを押し出す機構」を作らなければならない。
なぜなら、スクリプトだと順番に読み込まれるからである。
実際のコリントに近づけることによって再現する。

2014年11月24日月曜日

ボールカメラを酔わないようにする その3

「ボールとカメラは別」
>>ほい















 「ボールの位置を取得して、毎フレームごとにボールにカメラをついていかせる」
「っていうスクリプトをカメラにくっつける」
>>そぉい









using UnityEngine;
using System.Collections;

public class BallFollowCamera : MonoBehaviour {
    GameObject BlueBall;
    public float distance;
    public float height;
//    public float limit;

//    private Vector3 initialPosition;
   
    // Use this for initialization
    void Start () {
        BlueBall = GameObject.FindWithTag ("BlueBall");
        Debug.Log ("BlueBall: " + BlueBall.name);
    }
   
    // Update is called once per frame
    void Update () {
        this.transform.position = new Vector3(BlueBall.transform.position.x, BlueBall.transform.position.y + height, BlueBall.transform.position.z+ distance);
    }
}





「完」


そして・・・













やったぁ!!!!!
できたぁ!
ボールカメラキタ━━━━(゚∀゚)━━━━!!



後は、
「ボールの発射スクリプトを調整する」
「戻ってこないようにする板の可動範囲の調節」

だ!



※他の課題
「玉の撃ちだす方向の調整(Vector3の理解)」
「点数関連機能の実装」
「ボールの個数制限や点数系統の例外処理」
「発射機構の改善(引っ張って打つ奴の実装)」
「コリントの板に木目のテクスチャをキレイに貼り付ける(最難関)」
ここまで来て、やっとAndroidとPC(ブラウザ)版の公開になります。

次回作は予定済み!もう見本の材料も用意済み!お楽しみに!

2014年11月9日日曜日

ボールの発射スクリプトを調整する その2 + ボールカメラを酔わないようにする その2 + 【新課題】 戻ってこないようにする板の可動範囲の調節 その1

毎度の如く、「タイトルが長い」。
しょうがない。課題が増えていくんだもの。うーやだよー課題増えるのやだよ~(´・ω・`)ショボーン

とりあえず、
「ボールの発射スクリプトを調整する」

「ボールカメラを酔わないようにする」
だ。
「ボールカメラを酔わないようにする」
は後で・・・として、先に
「ボールの発射スクリプトを調整する」
だ。
今まで、
( ballObject.transform.forward ) * Speed + ballObject.transform.right,  ・・・
だった。
これ、forwardでやってたからダメだった。






だから言ったじゃないか!






この通り。
これを
new Vector3(2,StartY,Speed),  ・・・
にすると・・・






こ の 通 り。






やった進んだ!
Vector3でxyzを指定してやったらできた!



さてと次。
「戻ってこないようにする板の可動範囲の調節」
だ。
単純にこれは、あの斜めの板がまるで壊れたかのように真っ直ぐになっちゃう現象。

修正するところ
ヒンジジョイントの設定

簡単!・・・と思って行った時期も私にはありました。
「回転が到達できる最低/最高角度」
> なんかグワン!っていく
「Springを設定しないと自動的に戻ってこない」
> なんか重力関連で自動で戻ってきてた

  1. 設定してみた。
  2. 動作見てみた。
  3. なんかあんまり変わらんかった。(´・ω・`)ショボーン
角度ってなんなの!?
n°とかそれなの?
それともxyzに準じた角度なの?
よくわからん。
バネとかもあんまり意味を成してないような気もする。
Shadeだから?ShadeのObjectだから?それともUnity側?

あれは置いといて次。
「ボールカメラを酔わないようにする」
だ。
ググったり考えたりしたら、
「ボールとカメラは別で、カメラをボールの動きに合わせて毎フレームごとにボールについていかせる」
ってことをやればいい、ってことに気がついた。
「何言ってんだこいつ」
って思うかもだが、詳しく簡単に言うとこう。
  1. ボールとカメラは別。
  2. ボールの位置を取得して、毎フレームごとにボールにカメラをついていかせる。
  3. っていうスクリプトをカメラにくっつける。
こんな感じ。

この先書くのは次回かな・・・。
ボール回るようになったのはいいんだけど、なんで解決済みの課題からまた課題が出てくるのが不思議。

2014年11月7日金曜日

ボールを回転させる その2 + 【新課題】ボールの発射スクリプトを調整する その1 + 【新課題】ボールカメラを酔わないようにする その1

ボールを回転させる話・・・
なんと、バウンドさせる奴が悪さをしていた!
動摩擦係数と静止摩擦力がになっていた!
そりゃ回らないよ。
「摩擦力0」って。

なんで分かった?
  1. 別のプロジェクトで試してみた
  2. いろいろ比較した
  3. その結果、Physics Material(バウンドさせる奴)が無いことに気づく
  4. コピペして割り当てる
  5. 回らん。
  6. ググって確認した
  7. 摩擦力0だった。
というわけだ。

というわけで、摩擦を初期値の
「0.4」
にした。

回った!やっt・・・え?








おいどういうことだよ




多分回った事により、発射スクリプトの
「forward」
のところ。多分狂ったんだと思われる。

それと、これ





なんということでしょう







おいボールカメラ。
これじゃぁ酔うじゃないか。




結論
回転はいいんだ。
発射のスクリプトと
ボールカメラを酔わないようにする。



また課題増えた・・・(´・ω・`)ショボーン

2014年11月2日日曜日

壁をなくす その2 + 【新課題】ボールを回転させる その1

「ボールのy座標が『0』より下になったらReset処理を発動させる」
というスクリプトを書いてボールにくっつければ、完成!
ってことにしたい。

何と言うか・・・。
見つけたこととすれば、
「Resetを押すと、戻ってくることには戻ってくる」
「戻ってくるはいいけど、突き抜けてく」

簡単に言うと、回転やら移動やらを止めた状態で初期位置にテレポートさせればいいわけだ。
なんで移動を止めるか。
それは、ボールに割り当てたComponentの中で、
「RigidBody」
という、物理属性を与えるComponentを与えていた。
重力を有効にしていた。
落ちることで加速されていくため、超高速移動Objectとして当たり判定を突き抜けていた。
そのために止める。

それには、こういうプログラムを使う。
ballObject.rigidbody.velocity = Vector3.zero;
ballObject.rigidbody.angularVelocity = Vector3.zero;
上は移動を止める、
下は回転を止める。

まぁこれで出来たわけだ。





・・・まてよ?
ボールってほんとに回転してる?
 いやまさかぁ。
そのまさかがある?


あった。


_人人人人人人_
>回転してねぇ!<
 ̄Y^Y^Y^Y^Y^Y^ ̄

あの
「見た目が鉄のようなボール」。
回転してるように見えたあのボールも、実は

残念!それは目の錯覚だよ!
 テクスチャをわかりやすいやつに変えたら発覚した。
どうしてこうなった。



とりあえず、回転させたい。
でも回転などのやつにも、標準でunityは制限をかけているようだ。(まーた課題が増えた(´・ω・`)ショボーン)






壁をなくし、落ちた時の対処もできた!
でも、ボールが回転してなかったのは盲点だった。チッキショォォ!

また次回!

2014年11月1日土曜日

影の見え方 + 壁をなくす その1


 影の見え方を見るため、ライトを変えてみる。













これと













これを













これに。


すると













これから













これに。

ライトを変えた理由としては、ダボとか釘とかの影が出るかな~と思ったため。


・・・違和感あるな。
釘とかの影が出てこない・・・。
壁も違和感が・・・

そうだ。
別の課題をちゃちゃっとやって終わらせてみるか。

別の課題
「壁をなくす」

いけるんじゃね?
やってみた。













こんな感じ。
壁の影的違和感はなくなった。


問題はまだあるが。





釘とかの影が出てないこと。

調べたら、
ライトは、Shadow と投影することもできます。 影は、Pro 専用の機能です。 影プロパティは、ライトごとに調整可能です。
 「影はUnity Proな!
って書いてあった(´・ω・`)ショボーン
でも、なんか変な影的何かは出てるんだよなぁ・・・あの黒い部分。
この黒い部分は、結局光が当たってないところらしい。

調べたら、
「無料版でもUnity4.2から『HardShadow』のみ使用可能」
「『SoftShadow』でもHardShadowに自動でなる」
「出力プラットフォームが『Android・IOS・BlackBerry』だとできない」
と書いてあり、見てみたら、

_人人人_
>Android<
 ̄Y^Y^Y^ ̄
やってしもた・・・。

変える前

























影はこちら













キタ━━━━(゚∀゚)━━━━!!
影キタ━━━━(゚∀゚)━━━━!!


もう一つの課題、
それは、ボールがどっか行っちゃうんじゃね?ってこと。
このコリント、落ちるとResetできなくなるんだよなぁ・・・

というわけで
「ボールのy座標が『0』より下になったらReset処理を発動させる」
というスクリプトを書いてボールにくっつければ、完成!
ってことにしたい。

とりあえずここまで!
続きは次回!

2014年10月18日土曜日

視点切り替え機能の追加 その5

はぁ・・・長くなっちゃったなぁ・・・

前回、この話をどっかにやっちゃったのでやるよ!

俺の中で、仮説を立ててみた。
Buttonを
「RepeatButton」
にすればいいのでは?と。
RepeatButtonは、押してる限り、呼び出され続けるボタン。
なんか変わるかなぁ?と思って、やってみた。
なんだが、なんかよくよく見たら、こんなんあった





右 っ か わ

複数押されてたことに気が付かんかった・・・
別に、
「何個もログが出る」
ってわけではなかったんや・・・
気がつけばなぁ・・・

これはこれとして、
ひとつのボタンにまとめて~ってやって、後はポチッとな!
・・・とやりたかった。カチカチやりたかった。でも~反応しねぇ!else飛んだ!
やばいよやばいよ!ガチでやばいよ!!
これ。
いやぁーねぇ。

using UnityEngine;
using System.Collections;

public class ControlPanel : MonoBehaviour {
    GameObject Current_Camera;

    GameObject Main_Camera;
    GameObject Go_Camera;
    GameObject Go2_Camera;
    GameObject Right_Camera;
    GameObject Left_Camera;
    GameObject Back_Camera;
    GameObject Up_Camera;
    GameObject Lost_Camera;
    GameObject Ball_Camera;

    void Start () {
        Current_Camera = GameObject.FindWithTag("MainCamera");


        Main_Camera = GameObject.FindWithTag("MainCamera");
        Go_Camera = GameObject.FindWithTag("GoCamera");
        Go2_Camera = GameObject.FindWithTag("Go2Camera");
        Right_Camera = GameObject.FindWithTag("RightCamera");
        Left_Camera = GameObject.FindWithTag("LeftCamera");
        Back_Camera = GameObject.FindWithTag("BackCamera");
        Up_Camera = GameObject.FindWithTag("UpCamera");
        Lost_Camera = GameObject.FindWithTag("LostCamera");
        Ball_Camera = GameObject.FindWithTag("BallCamera");
        Debug.Log ("Main_Camera: " + Main_Camera.name);
        Debug.Log ("Go_Camera: " + Go_Camera.name);
        Debug.Log ("Go2_Camera: " + Go2_Camera.name);
        Debug.Log ("Right_Camera: " + Right_Camera.name);
        Debug.Log ("Left_Camera: " + Left_Camera.name);
        Debug.Log ("Back_Camera: " + Back_Camera.name);
        Debug.Log ("Up_Camera: " + Up_Camera.name);
        Debug.Log ("Lost_Camera: " + Lost_Camera.name);
        Debug.Log ("Ball_Camera: " + Ball_Camera.name);
    }

    void OnGUI () {
        GUIStyle style = new GUIStyle();
        style.fontSize = 30;//文字サイズ
        style.normal.textColor = Color.white;//文字色
        Debug.Log("通るって");
        if ( GUI.Button( new Rect(1100, 400, 200, 50), "Start!" )){
            Debug.Log("Startボタンが押されました。");

            GameObject startComp;
            startComp = GameObject.Find ("Start Button");
            startComp.GetComponent<ballshoot>().OnMouseDown();

        }
        if ( GUI.Button( new Rect(1100, 460, 200, 50), "Reset?" )){
            Debug.Log("Resetボタンが押されました。");

            GameObject resetComp;
            resetComp = GameObject.Find ("Reser Button");
            resetComp.GetComponent<Reset>().OnMouseDown();

        }
        if ( GUI.Button( new Rect(1100, 520, 200, 50), "Camera" )){
            Debug.Log("Cameraボタンが押されました。");
            ChangeView();
        }
//        if ( GUI.RepeatButton( new Rect(1100, 520, 200, 50), "Camera" )){
//            Debug.Log("Cameraボタンが押されました。");
//            //            ChangeView();
//        }

    }

    void ChangeView(){

        Debug.Log ("通るよ" + Current_Camera.name);
        if (Current_Camera.name == Main_Camera.name)  {
            Current_Camera = Go_Camera;

            Main_Camera.camera.enabled = false;
            Go_Camera.camera.enabled = true;
            Go2_Camera.camera.enabled = false;
            Right_Camera.camera.enabled = false;
            Left_Camera.camera.enabled = false;
            Back_Camera.camera.enabled = false;
            Up_Camera.camera.enabled = false;
            Lost_Camera.camera.enabled = false;
            Ball_Camera.camera.enabled = false;
          
        } else if (Current_Camera.name == Go_Camera.name) {
            Current_Camera = Go2_Camera;

            Main_Camera.camera.enabled = false;
            Go_Camera.camera.enabled = false;
            Go2_Camera.camera.enabled = true;
            Right_Camera.camera.enabled = false;
            Left_Camera.camera.enabled = false;
            Back_Camera.camera.enabled = false;
            Up_Camera.camera.enabled = false;
            Lost_Camera.camera.enabled = false;
            Ball_Camera.camera.enabled = false;
          
        } else if (Current_Camera.name == Go2_Camera.name) {
            Current_Camera = Right_Camera;

            Main_Camera.camera.enabled = false;
            Go_Camera.camera.enabled = false;
            Go2_Camera.camera.enabled = false;
            Right_Camera.camera.enabled = true;
            Left_Camera.camera.enabled = false;
            Back_Camera.camera.enabled = false;
            Up_Camera.camera.enabled = false;
            Lost_Camera.camera.enabled = false;
            Ball_Camera.camera.enabled = false;
          
        } else if (Current_Camera.name == Right_Camera.name) {
            Current_Camera = Left_Camera;

            Main_Camera.camera.enabled = false;
            Go_Camera.camera.enabled = false;
            Go2_Camera.camera.enabled = false;
            Right_Camera.camera.enabled = false;
            Left_Camera.camera.enabled = true;
            Back_Camera.camera.enabled = false;
            Up_Camera.camera.enabled = false;
            Lost_Camera.camera.enabled = false;
            Ball_Camera.camera.enabled = false;
          
        } else if (Current_Camera.name == Left_Camera.name) {
            Current_Camera = Back_Camera;

            Main_Camera.camera.enabled = false;
            Go_Camera.camera.enabled = false;
            Go2_Camera.camera.enabled = false;
            Right_Camera.camera.enabled = false;
            Left_Camera.camera.enabled = false;
            Back_Camera.camera.enabled = true;
            Up_Camera.camera.enabled = false;
            Lost_Camera.camera.enabled = false;
            Ball_Camera.camera.enabled = false;
          
        } else if (Current_Camera.name == Back_Camera.name) {
            Current_Camera = Up_Camera;

            Main_Camera.camera.enabled = false;
            Go_Camera.camera.enabled = false;
            Go2_Camera.camera.enabled = false;
            Right_Camera.camera.enabled = false;
            Left_Camera.camera.enabled = false;
            Back_Camera.camera.enabled = false;
            Up_Camera.camera.enabled = true;
            Lost_Camera.camera.enabled = false;
            Ball_Camera.camera.enabled = false;
          
        } else if (Current_Camera.name == Up_Camera.name) {
            Current_Camera = Lost_Camera;

            Main_Camera.camera.enabled = false;
            Go_Camera.camera.enabled = false;
            Go2_Camera.camera.enabled = false;
            Right_Camera.camera.enabled = false;
            Left_Camera.camera.enabled = false;
            Back_Camera.camera.enabled = false;
            Up_Camera.camera.enabled = false;
            Lost_Camera.camera.enabled = true;
            Ball_Camera.camera.enabled = false;
          
        } else if (Current_Camera.name == Lost_Camera.name) {
            Current_Camera = Ball_Camera;

            Main_Camera.camera.enabled = false;
            Go_Camera.camera.enabled = false;
            Go2_Camera.camera.enabled = false;
            Right_Camera.camera.enabled = false;
            Left_Camera.camera.enabled = false;
            Back_Camera.camera.enabled = false;
            Up_Camera.camera.enabled = false;
            Lost_Camera.camera.enabled = false;
            Ball_Camera.camera.enabled = true;

        } else if (Current_Camera.name == Ball_Camera.name) {
            Current_Camera = Main_Camera;

            Main_Camera.camera.enabled = true;
            Go_Camera.camera.enabled = false;
            Go2_Camera.camera.enabled = false;
            Right_Camera.camera.enabled = false;
            Left_Camera.camera.enabled = false;
            Back_Camera.camera.enabled = false;
            Up_Camera.camera.enabled = false;
            Lost_Camera.camera.enabled = false;
            Ball_Camera.camera.enabled = false;
          
        } else {
            Debug.Log("やばいよやばいよ");
            Current_Camera = Main_Camera;

            Main_Camera.camera.enabled = true;
            Go_Camera.camera.enabled = false;
            Go2_Camera.camera.enabled = false;
            Right_Camera.camera.enabled = false;
            Left_Camera.camera.enabled = false;
            Back_Camera.camera.enabled = false;
            Up_Camera.camera.enabled = false;
            Lost_Camera.camera.enabled = false;
            Ball_Camera.camera.enabled = false;
          
        }

    }

}
ってやった。
単純に、
「GameObject」
もなんにもない
「Current_Camera」
を利用している。
「正常に動作しないんじゃね!?」
と思うかもしれないが、これは
「『Current_Camera』に指定するCameraを切り替える」
という処理をしている。
enable関係は、単純にこれが無いと、
「どのCameraをenableにするか、どのCameraをdisabledにするか」
ができない。
この処理をやらないと、正常にCameraが切り替わらない。

このコードでは、
「GUI表示」
もやっている。
それで実際、GUIから発射などもできるようになっている。



 












このボタンの通り。













ボールを追うCameraもあるよ!





 やってみたい?いやいや。まだまだ。課題は残ってるからねぇ。