2017-07-07 6 views
-1

基本的には、Zを押すと関数を実行し、Xは関数を実行して回転を停止させようとしています。前に、私は完全にうまくいったUIボタンを持っていましたが、今はボタンでそれをやろうとしていますが、何も起こりません。あなたはそれが回転を開始し、唯一の「スペース」ボタンを押すことで回転を停止させる方法について提案することができるかどうボタンを押す(unity3d/C#)を実行する機能

また、それは素晴らしいことです。

相続人はこれまでのところ、私のコード:

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

public class spin : MonoBehaviour 
{ 
    public float speed = 500f; 
    public Button starter; 
    public Button stopper; 
    bool isSpinning = false; 

    IEnumerator spinnerCoroutine; 

    void Start() 
    { 
     //The spin function 
     spinnerCoroutine = spinCOR(); 

     //Button btn = starter.GetComponent<Button>(); 
     //Button butn = stopper.GetComponent<Button>(); 

     //butn.onClick.AddListener(FidgetSpinnerStop); 
     //btn.onClick.AddListener(FidgetSpinnerStart); 


     if (Input.GetKey(KeyCode.Z)) { 

      FidgetSpinnerStart(); 
     } 

     if (Input.GetKey(KeyCode.X)) { 
      FidgetSpinnerStop(); 
     } 
    } 

    IEnumerator spinCOR() 
    { 
     //Spin forever untill FidgetSpinnerStop is called 
     while (true) 
     { 
      transform.Rotate(Vector3.up, speed * Time.deltaTime); 
      //Wait for the next frame 
      yield return null; 
     } 
    } 

    void FidgetSpinnerStart() 
    { 
     //Spin only if it is not spinning 
     if (!isSpinning) 
     { 
      isSpinning = true; 
      StartCoroutine(spinnerCoroutine); 
     } 
    } 

    void FidgetSpinnerStop() 
    { 
     //Stop Spinning only if it is already spinning 
     if (isSpinning) 
     { 
      StopCoroutine(spinnerCoroutine); 
      isSpinning = false; 
     } 
    } 
} 

感謝。

+1

そわそわスピナー傾向が......あまりにも遠く – Hellium

答えて

1

はちょうど2つのあなたのコードに問題があります。

Update()機能は、すべてのフレームと呼ばれる一方でStart()が一度呼び出されます。

あなたは常に入力ごとにフレームをポーリングするUpdate()機能を使用する必要があります。

を使用してください。Input.GetKey()キーを押して確認する機能。

Input.GetKey()機能は、複数のフレームの上に真を複数回返すことができます。現在は何も問題は見られないかもしれませんが、isSpinning変数は問題の発生を防ぎますが、if (Input.GetKey(KeyCode.Z))コードの中にコードを直接追加すると問題が発生します。

あなたはInput.GetKeyDown()機能を使用する必要があります。

public class spin : MonoBehaviour 
{ 
    public float speed = 500f; 
    public Button starter; 
    public Button stopper; 
    bool isSpinning = false; 

    IEnumerator spinnerCoroutine; 

    void Start() 
    { 
     spinnerCoroutine = spinCOR(); 
    } 

    void Update() 
    {  
     if (Input.GetKeyDown(KeyCode.Z)) { 

      FidgetSpinnerStart(); 
     } 

     if (Input.GetKeyDown(KeyCode.X)) { 
      FidgetSpinnerStop(); 
     } 
    } 

    IEnumerator spinCOR() 
    { 
     //Spin forever until FidgetSpinnerStop is called 
     while (true) 
     { 
      transform.Rotate(Vector3.up, speed * Time.deltaTime); 
      //Wait for the next frame 
      yield return null; 
     } 
    } 

    void FidgetSpinnerStart() 
    { 
     //Spin only if it is not spinning 
     if (!isSpinning) 
     { 
      isSpinning = true; 
      StartCoroutine(spinnerCoroutine); 
     } 
    } 

    void FidgetSpinnerStop() 
    { 
     //Stop Spinning only if it is already spinning 
     if (isSpinning) 
     { 
      StopCoroutine(spinnerCoroutine); 
      isSpinning = false; 
     } 
    } 
} 

あなたはそれが回転を開始し、唯一の「スペース」ボタンを押すことで 回転を停止させる方法について提案することができた場合も、それはあなたがしていることを行うことができます偉大な

だろうKeyCode.Space。 Spaceキーが押されていることを確認し、コルーチンを開始/停止する前に変数isSpinningをチェックしてください。

すぐ下に1と上Update機能を置き換える:

void Update() 
{ 
    //Start if Space-key is pressed AND is not Spinning 
    if (Input.GetKeyDown(KeyCode.Space) && !isSpinning) 
    { 
     FidgetSpinnerStart(); 
    } 

    //Stop if Space-key is pressed AND is already Spinning 
    else if (Input.GetKeyDown(KeyCode.Space) && isSpinning) 
    { 
     FidgetSpinnerStop(); 
    } 
} 
+0

'入力を行っています。GetKey() 'はtrueをフレームごとに複数回返すことはできません。 –

+0

私はその権利をどのように語るべきかわかりません。私が言っていたことは、コードが複数回実行されるまでリリースされるまで** **多くの**フレームに渡って 'true'を返すということでした。単一のキーを押すと、そのキーが複数回実行される可能性があります。 – Programmer

+0

これは正しい言葉です。しかし、時にはあなたは、その動作(例えば自動銃) –

1

入力ロジックはStart()が実行されたときに1回だけ実行されます。

はそれのためにすべてのフレームをチェックするUpdate()方法でそれを入れてください。

この場合、コルーチンを取り除き、ロジック(while -loopなし)をUpdate()メソッドにも入れてください。 Start()機能でキー入力を.Checking

public class spin : MonoBehaviour 
{ 
    [SerializeField] 
    private float speed = 500f; 

    [SerializeField] 
    private Button starter; 

    [SerializeField] 
    private Button stopper; 

    [SerializeField] 
    bool isSpinning = false; 

    void Update() 
    {  
     if (Input.GetKeyDown(KeyCode.Z)) 
     { 
      isSpinning = true ; 
     } 

     if (Input.GetKeyDown(KeyCode.X)) 
     { 
      isSpinning = false ; 
     } 

     if(isSpinning) 
     { 
      transform.Rotate(Vector3.up, speed * Time.deltaTime) 
     } 
    } 
} 

Further reading

関連する問題