質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

315閲覧

側面をタップした時、その横にオブジェクトを設置したい

_Beginner

総合スコア103

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/04/06 09:28

編集2022/01/12 10:55

Unity3D

Minecraftのような、FPSの状態です。
カメラの中心から向いている前にRaycastを飛ばしています。

###やりたいこと

Scale(1, 1, 1)のキューブオブジェクト(Prefabオブジェクト)をMinecraftのように設置できるようにしたいです(Raycastが側面と当たっていたら側面側にオブジェクトを設置、Raycastがオブジェクトの下に当たっていたらその下にオブジェクトを設置できるようにしたい)。設置するオブジェクトの位置はRaycastが当たった位置の切り捨て+0.5fの値にしています。
なぜそのようにしているのかというと、オブジェクトの位置は整数ではなく、~.5の少数の形にしたいからです。
地面の位置はy = 0です。

###できていること
オブジェクトの上側にRaycastが当たっているときは、その上にオブジェクトを設置することはできています。

###現在のコード

C#

1 GameObject Prefab; 2 float distance = 5; 3 Ray rayFPS = new Ray(Camera.main.gameObject.transform.position, Camera.main.gameObject.transform.forward); 4 if (Physics.Raycast(rayFPS, out hitFPS, distance)) 5 { 6 if (Input.GetKeyDown(KeyCode.K)) 7 { 8 Instantiate(Prefab, new Vector3(Mathf.CeilToInt(hitFPS.point.x) - 0.5f, Mathf.CeilToInt(hitFPS.point.y) 9 + 0.5f, Mathf.CeilToInt(hitFPS.point.z) - 0.5f), Quaternion.Euler(-90, 0, 0)); 10 } 11 }

###起こる問題
上のコードでオブジェクトを設置しているのですが、これだと、オブジェクトの側面がRaycastの当たった場所になると、設置してあるオブジェクトと重なります。

また、オブジェクトの側面にRayが当たっているとき、Raycastのヒット位置のx座標が自分が立っている位置よりも大きい(例えばプレイヤーのx = 1hitFPS.point.x = 5)場合、コード上では**-0.5しているため、オブジェクトのScale 1個分**こっち側に設置されます。

しかし、オブジェクトの側面にRayが当たっているとき、Raycastのヒット位置のx座標が自分の立っている位置よりも小さい(例えばプレイヤーのx = 5hitFPS.point.x = 1)場合、コード上では**-0.5**しているため、設置されているオブジェクトに重なります(同じオブジェクトの為目では見えませんがインスペクターで重なっています)。

また、オブジェクトの下からRaycastが上を向いた状態で当たると、そのオブジェクトの下にオブジェクトを設置したいのですが、コードで、 Y + 0.5fされているので、重なってしまいます。

XとY座標だけを言いましたが、Z座標でも同じです。


設置するオブジェクトの位置はRaycastが当たった位置の切り捨て+0.5fの値にしています。

なぜそのようにしているのかというと、オブジェクトの位置は整数ではなく、~.5の少数の形にしたいからです。

と言いましたが、個人的にはこれが一番致命的な問題だと思っています。
しかし、どうしてもオブジェクトの位置は(X,Y,Zともに)~.5にしたいです。

補足してほしい情報がありましたらコメントお願いします。
回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

まず「キューブオブジェクト」の座標をTransformで管理しているところが間違いです。

マイクラやテラリア、ボードゲーム全般等のような、グリッドベースのゲームを作る場合は描画用座標とロジック用座標の2つを用いるのが基本です。
描画用座標はロジック用座標を元に決定されます。

今回の場合は、キューブオブジェクトのロジック用座標は整数型、描画用座標はロジック用座標+0.5ということになります。

新たに置くキューブオブジェクトのロジック用座標は、Rayが当たったキューブオブジェクトのロジック用座標と、RaycastHitから得られる衝突面の法線を元に計算できます。


今回の問題ではありませんが、キューブオブジェクトひとつひとつにMonobehaviourを付けて更新処理をさせるのは非常に負荷が高くなります。
いわゆるマイクラの「チャンク」のようなブロック管理のグループを用いて、それぞれのグループにそのグループに属するブロックの更新処理をさせるのが良いでしょう。

投稿2019/04/07 04:18

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問