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

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

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

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

Unity

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

Q&A

解決済

1回答

532閲覧

Unity Rayを使ったMinecraftのようなブロック設置

UDON3

総合スコア80

C#

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

Unity

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

0グッド

0クリップ

投稿2018/05/26 05:59

編集2018/05/26 06:59

前提・実現したいこと

UnityでMinecraftのようなブロック設置をしたいです。
Rayを使って座標を取得してみたのですがうまいく行きません
Rayが当たったブロックの中心座標までは出たのですが、法線の分だけ1ブロックずらすことができません。
中心座標もRayが当たった場所によっては変なところに行くので出来れば治したいです

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class RayScript : MonoBehaviour { public Camera Cor; void Update() { Ray ray = Cor.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo = new RaycastHit(); if (Physics.Raycast(ray, out hitInfo)) { this.transform.position = new Vector3(Mathf.Floor(hitInfo.point.x + 0.5f), Mathf.Floor(hitInfo.point.y + 0.5f) - 0.5f, Mathf.Floor(hitInfo.point.z + 0.5f)); } } } ### 補足情報(FW/ツールのバージョンなど) Unity2017.3.1f1

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

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

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

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

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

sakura_hana

2018/05/26 06:06

「法線の分だけ」というのはどういう意味ですか?(法線というと立方体の各面から出ているので1つに絞れないと思います) また、「Rayが当たった場所によっては変なところに行く」というのは具体的にどういうことか(発生条件等)記載してください。
UDON3

2018/05/26 06:10 編集

法線の分というのは、Rayが当たった所の面の向きにずらすということです。(西を向いている面に当てたらちゃんと西側にブロックが置かれるという感じです)Rayが下のほうに当たると本来の位置より下にずれます
guest

回答1

0

ベストアンサー

法線の分というのは、Rayが当たった所の面の向きにずらすということです。

現在のコードだと「どの面に当たったか」という情報が無いので、何処に当たっても同じ方向に動きます。
また、0.5m分しか動いていないので、ブロックの大きさによっては「1ブロックずらす」ことにはならないでしょう。

衝突した面の角度は「hitInfo.normal」で取れます。
なので以下のような形になるかと思います(動作未検証)。

C#

1public class RayScript : MonoBehaviour { 2 3public Camera Cor; 4public float blockSize; //ブロックの1辺の長さ。インスペクタから設定しておく 5 6void Update() 7{ 8Ray ray = Cor.ScreenPointToRay(Input.mousePosition); 9RaycastHit hitInfo = new RaycastHit(); 10if (Physics.Raycast(ray, out hitInfo)) 11{ 12this.transform.position += hitInfo.normal * blockSize; 13} 14} 15}

投稿2018/05/26 06:25

sakura_hana

総合スコア11425

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

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

UDON3

2018/05/26 07:08 編集

回答ありがとうございます。 無事面の方向にずらすことができたのですが、上下の面どちらかが必ず浮いてしまいます コードはこうなりました。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class RayScript : MonoBehaviour { public Camera Cor; public float blockSize; //ブロックの1辺の長さ。インスペクタから設定しておく void Update() { Ray ray = Cor.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo = new RaycastHit(); if (Physics.Raycast(ray, out hitInfo)) { this.transform.position = new Vector3(Mathf.Floor(hitInfo.point.x + 0.5f), Mathf.Floor(hitInfo.point.y+1f) - 0.5f, Mathf.Floor(hitInfo.point.z + 0.5f)); this.transform.position += hitInfo.normal * blockSize; } } }
sakura_hana

2018/05/26 07:26

私のコードだと始点が決まっていないのでtransform.positionの初期位置によって確かに狂いますね、すみません。 もっとシンプルにするなら下記でもいけるのではないかと思います。 this.transform.position = hitInfo.point; //または↓ //this.transform.position = hitInfo.point + Vector3.up * 0.5f; this.transform.position += hitInfo.normal * blockSize;
UDON3

2018/05/26 08:01 編集

このコードだとスナップが利かないので this.transform.position = hitInfo.point + Vector3.up * 0.5f; 小数点を切り落とすためにこうしていました。恐らく小数点を切り捨てる段階でずれたのだと思います。 ノーマルが下の時に例外処理を行うとよさそうな気がします。 this.transform.position = new Vector3(Mathf.Floor(hitInfo.point.x + 0.5f), Mathf.Floor(hitInfo.point.y+1f) - 0.5f, Mathf.Floor(hitInfo.point.z + 0.5f));
UDON3

2018/06/02 01:19

ひとまず今回は上下の誤差は無視できそうなので、ベストアドバイザーに選ばせていただきました。必要になったらまた質問します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問