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

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

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

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

Unity

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

Q&A

1回答

1485閲覧

UnityのShapes2DをAddComponentで動的に追加したいときに角丸デザインが反応しない

kaji

総合スコア648

C#

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

Unity

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

0グッド

0クリップ

投稿2021/07/29 18:34

編集2021/07/30 01:58

Shapes2DをAddComponentで動的に追加したいのですが、
角丸デザインが表示されず、通常ボタンのまま、角張ったままになってます。

GameObject obj = GameObject.Find("Button"); Shape shape = obj.AddComponent<Shape>(); shape.settings.roundness = 0.5f; shape.settings.shapeType = ShapeType.Rectangle;

既にGUI上でAddComponentし、以下GetComponentをすると上手く表示されます。

GameObject obj = GameObject.Find("Button"); Shape shape = obj.GetComponent<Shape>(); shape.settings.roundness = 0.5f; shape.settings.shapeType = ShapeType.Rectangle;

ボタンは1000個近くあり、そこに適用したいので、
どうにか動的にAddComponentしたいのですが、
わかる方、返信いただきたいです。

参考:Shapes2Dのドキュメントはこちら
https://sub-c.org/Shapes2D/documentation/index.html?highlight=setting#

#追記20210730
プロジェクトzipです。
https://drive.google.com/file/d/1Mku8_EPZlJdt88Q7Uy_LIX5kGmAO1M_W/view?usp=sharing

プレビュー画面の動画(mov)です。

https://drive.google.com/file/d/148DhzK27sboRL0j0sbhhKeNZNeUzmyJk/view?usp=sharing

プレビュー直後に適用されてません、なぜか、ボタンオブジェクトを選択すると丸くなるのですが、実際iPhoneなどで実行したところ角張った状態となります。

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

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

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

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

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

Bongo

2021/07/29 21:20

ちょっと試してみたのですが、私の場合はAddComponentでもちゃんと角丸になっているようでした。 ご提示いただいた部分以外に何か問題があるのかもしれません。現在制作中のシーンとは別に実験用のシーンを新規作成するところから始めて、そのシーンでおっしゃるような角丸が適用されない不具合を発生させる手順をご提示いただくことは可能でしょうか?
kaji

2021/07/30 01:59

プロジェクトzipとプレビュー動画を追加させていただきました。
guest

回答1

0

プロジェクトご提示ありがとうございます。動かしてますと確かにおっしゃる通りの挙動ですね。そして追記依頼欄で「私の場合はAddComponentでもちゃんと角丸になっているようでした」などと申し上げましたが、私の実験用シーンでもご質問者さんのおっしゃる挙動が観察されました。おそらく、最初に試した時はうっかりオブジェクトのインスペクターを表示したまま動かしてしまったんだろうと思います。早とちりしてすみませんでした。

インスペクターを表示してやると変更が反映される件ですが、ShapeEditorには下記のようなコードがありました。
丸みが4方向個別設定でない場合は、全方向共通の丸み設定を4方向それぞれの丸みプロパティにセットするような動作をしているようでした。

lang

1 // ここまで省略 2 ShapeType shapeType = (ShapeType) shapeTypeProp.enumValueIndex; 3 if (shapeType == ShapeType.Rectangle) { 4 // rectangle props 5 EditorGUILayout.PropertyField(roundnessPerCornerProp); 6 if (shape.settings.roundnessPerCorner) { 7 EditorGUILayout.PropertyField(roundnessTLProp); 8 EditorGUILayout.PropertyField(roundnessTRProp); 9 EditorGUILayout.PropertyField(roundnessBLProp); 10 EditorGUILayout.PropertyField(roundnessBRProp); 11 } else { 12 EditorGUILayout.PropertyField(roundnessProp); 13 roundnessTLProp.floatValue = roundnessProp.floatValue; 14 roundnessTRProp.floatValue = roundnessProp.floatValue; 15 roundnessBLProp.floatValue = roundnessProp.floatValue; 16 roundnessBRProp.floatValue = roundnessProp.floatValue; 17 } 18 } else if (shapeType == ShapeType.Ellipse) { 19 // 以降は省略

ですがShape自身にはこれに相当する処理をしている部分が見当たらず、さらにシェーダーへプロパティをセットする際にも4方向個別の丸みを渡しているだけで、全方向共通の丸み設定が反映されていないような感じでした。
仕方ないので、下記のように自前で4方向それぞれに丸みをセットしてやってはいかがでしょうか。

lang

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using Shapes2D; 6 7public class TestScene : MonoBehaviour 8{ 9 // Start is called before the first frame update 10 void Start() 11 { 12 GameObject obj = GameObject.Find("Button"); 13 Shape shape = obj.AddComponent<Shape>(); 14 // Shape shape = obj.GetComponent<Shape>(); 15 shape.settings.roundness = 0.5f; 16 17 // roundnessを四隅にセットする 18 shape.settings.roundnessTopLeft = shape.settings.roundness; 19 shape.settings.roundnessTopRight = shape.settings.roundness; 20 shape.settings.roundnessBottomLeft = shape.settings.roundness; 21 shape.settings.roundnessBottomRight = shape.settings.roundness; 22 23 shape.settings.shapeType = ShapeType.Rectangle; 24 shape.settings.fillType = FillType.SolidColor; 25 26 } 27 28 // Update is called once per frame 29 void Update() 30 { 31 32 } 33}

この挙動はちょっと不親切な感じですので、おそらく作者の方も意図的にこういう仕様にしたわけではなく、今回のようなケースをうっかり見落としてしまったんじゃないかな...と思います。

投稿2021/07/30 21:22

Bongo

総合スコア10811

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

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

kaji

2021/07/30 22:33 編集

AddComponentのAwakeやStartまわりのライフサイクルが原因かと思って、そこらへんを調べてましたが全然違ったようですね。 確認したところ、表示されました!。Bongoさんのおかげで解決できました。 ソースもそんな挙動になってたのですね。ソースがその様になってたのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問