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

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

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

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

Q&A

3回答

1468閲覧

objectの収縮をしたい。

YukioMaki

総合スコア21

C#

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

0グッド

0クリップ

投稿2017/10/08 12:44

Unity5.38でC#で書いています。
シーン場にあるcubeをFindGameObjectsWithTagを使って取得、それをMathf.Lerp関数を使ってcubeを一つずつ収縮させようと書いたのが下記のスクリプトです。
using UnityEngine;
using System.Collections;

public class Lerp : MonoBehaviour
{
public int i = 0;

public void Push() { GameObject[] blocks = GameObject.FindGameObjectsWithTag("cube"); { for (int i = 0; i < blocks.Length; i++) { float scale; float timmer = 0.0f; while (timmer < 0.5) { if (timmer < 0.25) { scale = Mathf.Lerp(1f, 1.2f, timmer / 0.25f); Debug.Log(i); } else { scale = Mathf.Lerp(1.2f, 1f, timmer / 0.5f); } blocks[i]. transform.localScale = Vector3.one * scale; break; } } } }

}
コンパイルは出来ました。動かすとDebug.log(i)はシーン場のcubeの数分表示されますが、収縮されません。
何処が間違っているのかが分からず困っています。
どなたか解決策をお願いします。

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

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

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

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

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

guest

回答3

0

シーン場のブロックを1個づつ大きさを収縮すろことが下記のスクリプトに書き換えることで出来ました。
using UnityEngine;
using System.Collections;

public class Lerp : MonoBehaviour
{
private GameObject gs;
private Check scripta2;
public bool goes;

void Start() { goes = false; gs = GameObject.Find("Check"); scripta2 = gs.GetComponent<Check>(); } void Update() { goes = scripta2.go; if (goes == true) { Debug.Log(goes); StartCoroutine(Push()); } } IEnumerator Push() { GameObject[] blocks = GameObject.FindGameObjectsWithTag("cube"); foreach (GameObject obj in blocks) { for (int i = 0; i < blocks.Length; i++) { float scale; float timmer = 0.0f; Debug.Log(blocks); while (timmer < 0.5f) { if (timmer < 0.25f) { scale = Mathf.Lerp(1f, 1.5f, timmer / 0.25f); Debug.Log(i); } else { scale = Mathf.Lerp(1.5f, 1f, timmer / 0.5f); } obj.transform.localScale = Vector3.one * scale; timmer += Time.deltaTime; yield return null; } } } }

}
でも、ブロックの収縮を止める方法が分かりません。1個のブロックが収集を1回したら止まり、次のブロックが収縮し、また次のブロックが収縮するようにしたいのですが、どなたか教えていいただけないでしょうか。

投稿2017/10/24 06:24

YukioMaki

総合スコア21

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

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

0

色々と突っ込みどころがありますが、やりたいことをコードにしてみると以下の感じでしょうか。(動作チェックはしてません)

cs

1public class LeapTest : MonoBehaviour 2{ 3 private GameObject[] _blocks; 4 private bool _isRunning = false; 5 private float _time = 0; 6 7 public void Push() 8 { 9 _blocks = GameObject.FindGameObjectsWithTag("cube"); 10 _isRunning = true; 11 _time = 0; 12 } 13 14 private void Update() 15 { 16 if (!_isRunning) 17 { 18 return; 19 } 20 21 float scale = 0; 22 23 if (_time < 0.25f) 24 { 25 scale = Mathf.Lerp(1.0f, 1.2f, _time / 0.25f); 26 } 27 else 28 { 29 scale = Mathf.Lerp(1.2f, 1.0f, _time / 0.5f); 30 } 31 32 foreach (var block in _blocks) 33 { 34 block.transform.localScale = Vector3.one * scale; 35 } 36 37 _time += Time.deltaTime; 38 39 if (_time >= 1f) 40 { 41 _isRunning = false; 42 43 foreach (var block in _blocks) 44 { 45 block.transform.localScale = Vector3.one; 46 } 47 } 48 } 49}

いくつか気になる点としては、中で使っている数値(0.25とか)が決め打ちなので、インスペクタから操作できるなどして、あまりハードコード(直に数値を書かくこと)をしないようにしたほうがいいです。

コードから推測したのは、実行された際に少しだけ大きくなって、元にもどる、みたいな挙動を想定している感じですよね?

実装的にはもっとうまいやり方があると思うので、色々と試してみてください。
ひとまずは、なぜ動かないのか、を上記コードから読み取ってください。

ちょっと勘違いしている部分が多すぎて、すべてに回答するのはむずかしいです。

ひとつだけポイントを付け加えておくと、最初のうちはwhileでループを作りがちですが、これは「1フレームですべてのループ処理が終わる」ことを認識してください。

今回のようにアニメーションをさせたい場合は、必ず毎フレームごとに値が変わるように実装しないと想定した通りに動きません。

投稿2017/10/08 17:44

edo_m18

総合スコア2283

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

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

0

timerの値を変更している箇所が見当たりませんが、これが原因じゃないでしょうか。


それと、ツッコミを入れたい点として、3点ほど

  1. 質問する際、見やすくするためソースコードは「```」×2で囲ってください。

C#

1public int i = 0;

とありますが、

C#

1for (int i = 0; i < blocks.Length; i++) 2{

とループ内部でiを定義しているので、前者の宣言は不要です。
むしろ、どちらのiか分からなくなるため、前者の宣言は行わず、各関数のループ内で毎回定義した方がよいです。

C#

1while (timmer < 0.5) 2{ 3 // …(中略) 4 break; 5}

とありますが、これだとif文と同じじゃないでしょうか。

投稿2017/10/08 13:31

fiveHundred

総合スコア9796

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問