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

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

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

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

Unity

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

Q&A

解決済

2回答

1890閲覧

Unity C# 大きさをランダムに生成

doraemon1106

総合スコア18

C#

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

Unity

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

0グッド

0クリップ

投稿2020/01/07 18:25

編集2020/01/07 18:26

C++はある程度熟知していますがC#は初心者です。
Unityのオブジェクトを大きさをランダム生成することは可能でしょうか?また、そこから伸縮していくことは可能でしょうか?
アニメーションをいくつか作って、そこからランダムに生成するのも考えたのですが、かなり多くのパターンをランダムに作りたいのでC#上のプログラムでなんとかできませんか?
伸縮していくとは一度大きくなって元に戻ることです。アニメーターではできるのですが、C#でうまくつくれなくて困っています。

理想としては、例えば球のオブジェクトがあったとして、
1.ランダムな大きさの球を生成
2.その球をある程度大きくさせる
3.その球を最初に生成した大きさに戻す
4.2と3を繰り返す

ようなものを作りたいです。アニメーター使えば2~4は簡単に作れますが1ができなくて・・・

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Heart : MonoBehaviour
{

void Start() { } void Update() { int scale = (int)Random.Range(50.0f, 60.0f); Transform myTransform = this.transform; Vector3 localScale = myTransform.localScale; localScale.x = scale; localScale.y = scale; localScale.z = scale; myTransform.localScale = localScale; }

とりあえずランダムに生成するのは作ってみたのですが、これでは何回もランダムに生成されてしまいます。一回生成してそこから大きさをループするのはどうすればいいのでしょうか?

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

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

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

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

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

Zuishin

2020/01/08 00:54

自分を大きく見せようとすると回答がつきにくくなりますよ。回答に書ける量は限られているので、回答者は「質問者はここまで知ってる」というラインを想定して回答します。 「C++ をある程度熟知している」という文言から、プログラミング初心者に説明するような初歩的なことを説明する回答が非常に書きにくくなっています。しかし実際にはプログラミング初心者の質問にしか見えません。 仮に「私は野球の十年選手ですがバットは何本持ったらいいですか?」という質問があったとしたら、質問の意味を図りかねて答えに窮するのではありませんか?
guest

回答2

0

ベストアンサー

Update内に処理を記述してあると、その処理は毎フレームごとに呼び出されるため、何度も生成されてしまいます。
加えて変数をUpdate内で宣言すると何度も変数の宣言が行われるためよくありません。

なのでclass内であらかじめ変数を宣言し、以後は使い回します。
また、1と2,3の処理を分けて記述します。理由としては生成は1度だけ行うが、伸縮は繰り返し行うため、統合すると何度も生成され大変なことになります。

GameObject.CreatePrimitive (PrimitiveType.Cube);はヒエラルキー上で右クリック➡Createから生成できるオブジェクトを自動的に生成する処理です。今回は適当にCubeにしています。

i = RandomNum + Mathf.PingPong(Time.time*2f, ChangeScale);はStartの際にランダム生成した数値を基に+し、Mathf.PingPomgはPingPong (float t, float length);値 t を行き来させます。 t は length より大きくなることも 0 より小さくなることもありません。

返される値は 0 と length の間を行ったり来たり移動します。
なので、仮にCubeのスケールが3で生成されると、3~6の大きさで変化し続けます。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class RandomOb : MonoBehaviour 6{ 7 public GameObject Cube; 8 private GameObject CopyCube; 9 public float ChangeScale = 3; 10 private float RandomNum; 11 private float i; 12 void Start() 13 { 14 CreateRandomOB(); 15 } 16 17 void Update() 18 { 19 ChangeScaleOB(); 20 } 21 22 void CreateRandomOB() 23 { 24 RandomNum = Random.Range(1,5); 25 if(Cube == null) 26 { 27 Cube = GameObject.CreatePrimitive (PrimitiveType.Cube); 28 } 29 CopyCube = Instantiate(Cube,Vector3.zero,Quaternion.identity); 30 CopyCube.transform.localScale = new Vector3(RandomNum,RandomNum,RandomNum); 31 } 32 33 void ChangeScaleOB() 34 { 35 i = RandomNum + Mathf.PingPong(Time.time*2f, ChangeScale); 36 CopyCube.transform.localScale = new Vector3(i,i,i); 37 } 38}

投稿2020/01/08 01:00

Y0241-N

総合スコア1066

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

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

0

貴方のコードを尊重して、直してみました。
randomScaleの上げ下げの数値に関してはコンストラクタで決めてしまっています。

C#

1public class Heart : MonoBehaviour 2{ 3 int randomScale; 4 int scale; 5 6 void Start() 7 { 8 //一定数づつ伸縮していくので初期化でランダム値を決めてしまう。 9 randomScale = (int)Random.Range(50.0f, 60.0f); 10 scale = 0 11 } 12 13 void Update() 14 { 15 //伸縮していく 16 scale += randomScale; 17 if (scale >= 100 && scale <= 0){ 18 randomScale = -randomScale; 19 } 20 21 //自身のscaleに代入する。 22 Transform myTransform = this.transform; 23 Vector3 localScale = myTransform.localScale; 24 localScale.x = scale; 25 localScale.y = scale; 26 localScale.z = scale; 27 myTransform.localScale = localScale; 28 } 29}

投稿2020/01/08 00:53

stdio

総合スコア3307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問