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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

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

Q&A

解決済

4回答

982閲覧

正数と負数の間に0を挟んで交互に繰り返す

agu

総合スコア41

Unity

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

0グッド

1クリップ

投稿2019/04/24 06:50

編集2019/04/24 07:31

update(){
x++;
Debug.Log(Mathf.Pow(-1,x));
}

フレームが進むごとにxを加算し、-1をx乗したものをログとして出すと、
フレームが進むごとに1と-1を繰り返すログが出ると思うのですが、
この1と-1の間に0を挟む方法を探しています。

ログの結果が、
0
1
0
-1
0
1
のようにしたい場合、簡単に数式で求める方法があるのであれば知りたいところなのですが、効率の面からif文を使った方が良いなどの判断もあるかと思います。皆さんはどのようにしていらっしゃるのでしょうか?
浅学で申し訳ありませんが、ご教授いただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

dodox86

2019/04/24 07:03

Unity特有の問題では無い気がするのでお聞きしますが、なぜif文を使ってはいけない(使いたくない?)のでしょうか。
agu

2019/04/24 07:22

ご質問ありがとうございます! そうでした!unity特有ではなかったです。 if文を使わないのは大きな理由はないのですが、思い込みのようなものかもしれません。 if文を使わずに求める方法がすでにあるけども自分は知らず、皆さんはこのような場合にはif文を使わない手を使っているのではと思ったことが理由でした。 方法はあっても実はif文を使った方が速いためif文を使うなどの判断もあるかと思いますので、質問を変えさせていただいて、このようなときは皆さんどうしているのかが知りたいという内容にさせていただきます。
tmp

2019/04/24 09:22 編集

メモリアクセスなし(配列)、分岐なしパズル? (2-(x&3))*(x&1) 掛け算なし? (0-(x&1) )&(2-(x&3)) C#で、わざわざ式になんてすることなんてほとんどない気がします。昔、アセンブリ言語での高速化の為の準備で考えたことはあります。 繰り返しなら配列を使うことが多いと思います。
dodox86

2019/04/24 10:39

>tmpさん 「 (0-(x&1) )&(2-(x&3))」面白い。。。感心してしまいました。案として回答に投稿された方が良いのでは、と思いました。
agu

2019/05/26 00:07

ご返答が大変遅くなりました。申し訳ありません。ビット演算に触れた事がなかったのですが面白いですね。論理積と合わせてこんな風に使えると知らなかったので大変勉強になりました!回答投稿ではありませんので、こちらで失礼しますが、ありがとうございます!
guest

回答4

0

ベストアンサー

色々あると思いますが、一番シンプルなのは、

cs

1 void Update() 2 { 3 x++; 4 Debug.Log(new float[] { -1, 0, 1, 0 }[x % 4]); 5 }

でしょうけど、もしxがintでなくfloatになり、間を補完する必要性があることを考慮するならば、

cs

1 void Update() 2 { 3 x++; 4 Debug.Log(-1.0f + Mathf.PingPong(x, 2.0f)); 5 }

でしょう。

更に将来的にもっと滑らかに変化させて、更にinspector上で設定したいとあれば、

cs

1 public AnimationCurve curve; 2 3 void Start() 4 { 5 curve = new AnimationCurve(new Keyframe(0, -1), new Keyframe(2, 1)); 6 curve.postWrapMode = WrapMode.PingPong; 7 } 8 9 void Update() 10 { 11 x++; 12 Debug.Log(curve.Evaluate(x)); 13 }

です。(まぁ、ここまではやりすぎでしょうけど)

投稿2019/04/24 12:46

katsuko

総合スコア3469

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

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

agu

2019/06/04 04:13

ご回答いただきありがとうございます!配列を用意してしまうのが一番利用しやすそうですね。 今回はシンプルに利用ができ複数のパターンへのフォローもあったこちらの回答をベストアンサーとさせていただきます。
guest

0

Xが加算されていく事前提です。

B列:X(A列)を4で割った余りを出す
C列:B列を2で引く
D列:C列を2で割った余りと、C列を掛ける。(剰余によっては掛ける必要はないかも)
E列:D列に-1を掛ける。(0,-1,0,1...の順だったので反転しているだけです)
イメージ説明

Unityの言語が何か知らないので、適宜対応してください。

<追記>
if文を使ってよいのなら

最初に4で割った余りを出す所は変わらず。

あとは単純に
答えが0か2なら 0を返す
答えが1なら 1を返す
答えが3なら -1を返す

が一番単純かと。

投稿2019/04/24 07:12

編集2019/04/24 07:32
torisan

総合スコア678

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

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

fuzzball

2019/04/24 07:19

①〜④はB〜Eにした方が分かりやすいと思います。
torisan

2019/04/24 07:26

修正しました。
agu

2019/06/04 06:15

ご回答いただきありがとうございます!数式を作って答えを出すとこういった感じになるんですね。わかりやすいです。思い通りの数値を算出する式を考えるのが楽しそうな方法だと思いました。
guest

0

数式として単純に...という観点から考えてみますと、点を90°ずつくるくる回転させる動きに似ていますね。
計算量の面で特にアドバンテージがあるわけではないですが、0→1→0→-1→0→...と対になって変化する1→0→-1→0→1→...という値も一緒に欲しいといったケースでは使いみちがあるかもしれません。

Quaternion

C#

1using UnityEngine; 2 3public class QuaternionRotor : MonoBehaviour 4{ 5 private Quaternion x; 6 private Quaternion r; 7 8 private void Start() 9 { 10 this.x = Quaternion.identity; 11 this.r = new Quaternion(0.0f, 0.0f, 1.0f, 0.0f); 12 Debug.Log(this.x.z); 13 } 14 15 private void Update() 16 { 17 this.x *= this.r; 18 Debug.Log(this.x.z); 19 } 20}

float2

C#

1// パッケージマネージャーでMathematics(またはEntities)をインストールする必要があります 2using Unity.Mathematics; 3using UnityEngine; 4 5public class Float2Rotor : MonoBehaviour 6{ 7 private float2 x; 8 private float2x2 r; 9 10 private void Start() 11 { 12 this.x = new float2(1.0f, 0.0f); 13 this.r = new float2x2(0.0f, -1.0f, 1.0f, 0.0f); 14 Debug.Log(this.x.y); 15 } 16 17 private void Update() 18 { 19 this.x = math.mul(this.r, this.x); 20 Debug.Log(this.x.y); 21 } 22}

Complex

C#

1using System.Numerics; 2using UnityEngine; 3 4public class ComplexRotor : MonoBehaviour 5{ 6 private Complex x; 7 private Complex r; 8 9 private void Start() 10 { 11 this.x = Complex.One; 12 this.r = Complex.ImaginaryOne; 13 Debug.Log(this.x.Imaginary); 14 } 15 16 private void Update() 17 { 18 this.x *= this.r; 19 Debug.Log(this.x.Imaginary); 20 } 21}

投稿2019/04/24 19:10

Bongo

総合スコア10807

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

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

agu

2019/06/04 04:10

ご回答いただきありがとうございます!時計のように実際に回転を利用している点が面白く感じました!色々な見方があるものなんですね!
guest

0

Bongoさんの回答を見てピンと来ました。

c

1double pi = 3.141592653589793; 2for (int i = 0; i < 16; i++) { 3 printf("%d, ", (int)sin(i * 90 * pi / 180)); 4} 5//=> 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1,

sinそのものですね。

投稿2019/06/04 06:59

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問