3D ブロック崩し

現在読込中です。
この表示が消えない場合はJavaScriptを有効にして、
UnityWebPlayerをインストールしてください。

1.マウスの左クリックでボールが動き始めます。
2.マウスのドラック軌道でプレイヤーを動かせます。

プレイヤーがX軸(左右)のみ動かせるよう修正しました。
ポイント
◎プレイヤーをX軸のみ動くやり方を教えて下さい。
(匿名さんのおかげで解決しました。)
◎左右の壁を削除して、ゲーム画面の左右両端でバウンドさせるやり方を教えて下さい。
(絶対に画面バウンドを実装します!)

投稿者情報
NAME : @studiotsuchie
URL : https://twitter.com/studiotsuchie
Profile : 2015年1月、Unityを知り、頑張れば個人でもゲームが作れると意気込んでいます。

「3D ブロック崩し」への23件のフィードバック

  1. 制作した者です。壁を作ってあるのに表示されない意味が分かりません。早急に直しますので、いろいろ教えてください。
    今後の目標。
    1.ブロックは上にも下にも配置して1段全部なくなったら、上の段が落ちて来る仕様にする。
    2.球だけがブロックの当たり判定OKにする。
    3.プレイヤーが球を3回弾くと奥から1列のランダムなブロックが生成されて、ブロックが押される仕様にする。
    4.ブロックがプレイヤーのZ軸まで到達したらGAME OVERにする。
    5.画面の左右両端のラインで球がバウンドするようにする。

    とても解りにくいと思いますが、有志の皆さんにアドバイスなどご強力をお願いします。

  2. ファイルが大きすぎますね
    余分なアセットや音楽ファイルなど削除してみてはどうでしょうか
    この規模のゲームなら一瞬でロード終わるぐらい小さくなるはずです

    壁が消えているとのことですがゲームを始めるまで表示されているならば
    ブロックと同じスクリプトが付いていて消失してしまったのではないのでしょうか

  3. JavaScript
    var range = 5.0;// 移動範囲
    var x = Camera.main.ScreenToWorldPoint(Input.mousePosition).x;
    x = Mathf.Clamp(x, -range, range);
    transform.position.x = x;

    C#
    float range = 5f;// 移動範囲
    float x = Camera.main.ScreenToWorldPoint(Input.mousePosition).x;
    x = Mathf.Clamp(x, -range, range);
    Vector3 tp = transform.position;
    transform.position = new Vector3(x, tp.y, tp.z);

    ラケットはこんな感じで思い通りに動くようになると思う

    1. パースカメラで使う場合
      Vector3 mousepos = Input.mousePosition;
      mousepos.z = 10;
      float x = Camera.main.ScreenToWorldPoint(mousepos).x;

  4. >左右の壁を削除して、ゲーム画面の左右両端でバウンドさせる
    メインカメラのProjectionを変えてみては?
    それでカメラを真上に置いてから真下に向けて、フレームぎりぎりに壁を置くとか。

  5. 3Dで、画面の左右を壁にするというのは、かなり難しいのではないですか。
    特にマルチデバイス対応の場合は。
    なんであれ、上達の速度にはびっくりします。

  6. 皆々様のコメントに感謝しています。
    早速、匿名Aさんが描いてくれたJavaをPlayerのスクリプトに反映してみましたが動きません。いろいろ実験してみます。
    M2Rabさんの案「メインカメラのProjection」については、調べます。
    匿名Bさんへ、やっぱり難しい事なのかなぁと思います。
    左右の壁を逆の台形(底辺が小さく、上辺が大きい)にしてカメラの角度で長方形に見えるとかやってみましたが、変なバウンドをしてしまいます。バウンドの角度をいじくる方法がいいのですか?

    1. Camera.main.WorldToScreenPoint(球のtransform.position)
      これで球の画面上での位置が取得できるので
      0>球.x y または Screen.width Screen.height<球.x yの時に
      rigidbody.velocityのx yのみ反転して
      前のフレームの座標に戻してあげれば
      画面の端で跳ね返すことができますよ

      var range = 5.0;
      var mousepos = Input.mousePosition;
      mousepos.z = 10;
      var x = Camera.main.ScreenToWorldPoint(mousepos).x;
      x = Mathf.Clamp(x, -range, range);
      transform.position.x = x;
      ラケットはupdate内にこれをコピペすれば動くはずです

      1. お世話になります。
        画面の左右両端で球を強制的にバウンドさせる理屈は、rigidbody.velocity(球自体の速度)のXを反転させるんですね!なんとなく理解できました。ありがとうございます。
        ラケットのスクリプトも、今すぐ実行してみます。
        重ね重ね感謝してます。

      2. ラケットのスクリプトの件はありがとうございます。
        もうひとつの課題「球を画面の左右両端」でバウンドさせるスクリプトを
        考えていますが、うまくいきません。ご教授頂けると幸いです。

        function Update () {
        if (Input.GetMouseButton(0) && rigidbody.velocity == Vector3(0, 0, 0)){
        rigidbody.AddForce((transform.forward + transform.right) * Speed, ForceMode.VelocityChange);
        }

        var bounce:Vector3 = Camera.main.WorldToScreenPoint(transform.position);

        if (bounce.x < 0){
        rigidbody.velocity.x = -rigidbody.velocity.x;
        }

        else if (bounce.x <= Screen.width.x){
        rigidbody.velocity.x = -rigidbody.velocity.x;
        }
        }

        BCE0019:'x'is not a member of 'int'.となります。

        1. bounce.x >= Screen.width
          Screen.widthのxがエラーの原因ですね
          あとは =ですね
          これはまあ動いていたら気づいていたでしょう

        2. エラーメッセージが表示されているのですから、対策をご自身で考えてはどうでしょうか?なんでも丸投げして「自分で作った」と言うつもりなの?

        3. すみません
          これ平行カメラか真正面から写したものじゃないと
          反射正しくないです

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>