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

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

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

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

Unity

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

Q&A

解決済

1回答

850閲覧

重ねて置けるのを防ぎたい

urururur

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2020/06/02 09:28

編集2020/06/03 13:37

前提・実現したいこと

Unityで2dのMinecraftのようなサンドボックスゲームを作っています。
(座標1つに1×1のブロックを敷き詰めるようになっています)
一つのスクリプトで、ブロックが既に置いてある場合には置けなくしたいのですが、2マス以上の場合の処理がどうしても思い付きません。
サンプルコードか考え方のヒントを教えていただけないでしょうか?

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class player : MonoBehaviour { public GameObject[] objects; public GameObject[] cursorobjects; public GameObject cursor; public int objectnumber; // Start is called before the first frame update void Start() { } void Update() { if (Input.GetMouseButtonUp(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit = new RaycastHit(); Vector3 hitposition = Camera.main.ScreenToWorldPoint(Input.mousePosition + Camera.main.transform.forward); Debug.Log(hitposition); float x = (Mathf.Round(hitposition.x)); float y = (Mathf.Round(hitposition.y)); if (Physics.Raycast(ray, out hit)) { cursor.transform.position = new Vector3(x, y, 0); } else { Instantiate(objects[objectnumber], new Vector3(x, y, 0), Quaternion.identity); } } } }

試したこと

カーソルのようなものを作り、置く前に当たっているかどうかをOntriggerで取ろうとしたのですが、私の考え方ではどうしてもスクリプトが二つ以上になってしまいます。

コードの問題点

このコードだと、クリックした場所一マスの部分に、ブロックがあるかどうかしか取れないので、scaleのxかyの値が2位上になると半分埋まった状態でも、置けてしまいます。
情報の不備などがございましたら、指摘して頂けるとありがたいです。

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

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

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

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

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

sakura_hana

2020/06/03 01:33

Raycastしてオブジェクトの有無を探るという発想自体は合っていると思います(地面を考慮しなくていいのか?という疑問はありますが) 今のコードの問題点は何ですか?「ブロックを配置した状態でもPhysics.Raycastがtrueにならない」など、問題を具体的に記載してください。 また、どうしてスクリプトが1つでなければいけないのかも一応記載してもらえるといいと思います。(そもそも「1つ」とはCSファイル1つですよね? メソッド1つとかではなく)
urururur

2020/06/03 13:28

ありがとうございます。 返信遅れてしまい申し訳ございません。 スクリプト一つで作りたい理由は、別の機能でカーソルにontrigger使いたいからです。(的外れな事を言っていたら指摘していただけるとありがたいです) スクリプト一つでの意味は、csファイル一つでと言う意味で、書かせていただきました。コードの問題点は、今から質問を編集しますので、少々お待ち頂きたく存じます。
sakura_hana

2020/06/03 23:53

>コードの問題点 Boxcastを使ってみてはどうでしょうか。(Raycastを複数実行してもいいと思いますが、多分こちらの方が適してそう) http://tsubakit1.hateblo.jp/entry/2016/02/25/025922 >スクリプト1つ 複数のスクリプトにそれぞれOnTriggerEnter等を書いても問題ありません。 なのでCSファイル1つに固執する必要は無いと思います。
urururur

2020/06/04 13:32

返信ありがとうございます。 Boxcastをカーソルにつけ、重なっていたら置けなくするスクリプトが書けました。!! Ontriggerについてもものすごく勉強になりました。!! ゲームに大切な部分だったのでとても参考になりました。ありがとうございました。
sakura_hana

2020/06/04 23:33

解決して何よりです。自己回答とベストアンサーを付けて質問をクローズしてください。
guest

回答1

0

自己解決

Boxcastを使ったらブロックの判定が取れました!!sakura_hanaさん有り難うございました。

投稿2020/06/06 03:55

urururur

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問