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

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

ただいまの
回答率

90.50%

  • C#

    7121questions

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

  • Unity

    4006questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • C++

    3456questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Arduino

    539questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

arduino 人感センサーを使ってunity animationをスクリプトで制御したい。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 420

popopym

score 2

Blenderでボーンを入れた人のオブジェクトをunityで読み込み、unity-chanのモーションをつけてanimatorで動かしています。

人感センサー(SB412A)で数値を読み取ったら、unity で動かしている人のオブジェクトを動くようにしたいのですが、どうしたらいいかがわからず混乱しています。

//Arduino側
void setup() {
  Serial.begin(115200);
}

void loop() {
  int v = analogRead(0);
  Serial.println(v);
  delay(100);
}
//unity側
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
Animator _animator;

public string portName = “/dev/cu.usbmodem1421";

public int baudRate = 115200;

private serialPort serialPort_;
private Thread thread;
private bool isRunnning_ = false;

private string message_;
private bool isNewMessageReceived_ = false;


void Start () {

        _animator = GetComponent<Animator>();
    }


public void startAnimation(){

        if(_animator){

            _animator.Play("walk");

        }else{


    public void changeAnimation(){
animator.Play("jump00B");

    }


    }

通常時(センサーに反応していない時)は歩いていて,センサーに反応したらジャンプするという
コードのつもりです、、、

本当に慣れてないのでコードがめちゃくちゃだと思います、、、
すみませんがどなたかお力を貸していただけないでしょうか・・・。


y_waiwai様 、MasahikoHirata様
本当にご返答ありがとうございます!

MasahikoHirata様のコードをお借りして、実行してみたのですが 
なかなか上手くいきません、、。
もう少し調べてみようと思います、、

↓ 現在のコードです。

追記

//Arduino
#define in A0
#define H 1
#define L 0
int mode;

void setup() {
  Serial.begin(115200);
  pinMode(in, INPUT);
  mode = L;
}

void loop() {
  int status;
  status = digitalRead(in);
  if (status == H) {
    if (mode == L) {
      mode = H;
      Serial.print("L");
    } else {
      if (mode == H) {
        mode = L;
        Serial.print("H");
      }

    }
  }

}
//unity側 、ボタンを押すとアニメーションが変わる
using UnityEngine;
using System.Collections;
using System.Collections.Generic;


public class animation : MonoBehaviour
{

    private Animator animator;

    private const string key_isRun = "isRun";
    private const string key_isJump = "isJump";

    // Use this for initialization

    void Start()
    {
        this.animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.H))
        {
            this.animator.SetBool(key_isRun, true);


        }
        else
        {
            this.animator.SetBool(key_isRun, false);

        }

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

            this.animator.SetBool(key_isJump, true);

        }
        else
        {
            this.animator.SetBool(key_isJump, false);


        }
    }
}
//unity側でシリアル通信をするためのコード
using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System.Threading;

public class SerialHandler : MonoBehaviour
{
    public delegate void SerialDataReceivedEventHandler(string message);
    public event SerialDataReceivedEventHandler OnDataReceived;

    public string portName = "/dev/cu.usbmodem14141"; 
    public int baudRate = 115200; 

    private SerialPort serialPort_;
    private Thread thread_;
    private bool isRunning_ = false;

    private string message_;
    private bool isNewMessageReceived_ = false;

    void Awake()
    {
        Open();
    }

    void Update()
    {
        if (isNewMessageReceived_)
        {
            OnDataReceived(message_);
        }
        isNewMessageReceived_ = false;
    }

    void OnDestroy()
    {
        Close();
    }

    private void Open()
    {
        serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);

        serialPort_.Open();

        isRunning_ = true;

        thread_ = new Thread(Read);
        thread_.Start();
    }

    private void Close()
    {
        isNewMessageReceived_ = false;
        isRunning_ = false;

        if (thread_ != null && thread_.IsAlive)
        {
            thread_.Join();
        }

        if (serialPort_ != null && serialPort_.IsOpen)
        {
            serialPort_.Close();
            serialPort_.Dispose();
        }
    }

    private void Read()
    {
        while (isRunning_ && serialPort_ != null && serialPort_.IsOpen)
        {
            try
            {
                message_ = serialPort_.ReadLine();
                isNewMessageReceived_ = true;
            }
            catch (System.Exception e)
            {
                Debug.LogWarning(e.Message);
            }
        }
    }

    public void Write(string message)
    {
        try
        {
            serialPort_.Write(message);
        }
        catch (System.Exception e)
        {
            Debug.LogWarning(e.Message);
        }
    }
}

unity側でアニメーションを再生するコードとarduinoからの信号を受け取るコードを
別に分けて書きました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

・まず、キーボード入力かなんかででいいので、歩いているかジャンプするかを切り替えるコードを実装します
・つぎに、シリアル受信してセンサに反応してるかしてないかの判定して、コンソールでいいので出力するコードを実装します
・あとはその2つを組み合わせればお望みの動作に。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/26 17:25

    回答ありがとうございます!
    少し質問失礼致します。。

    >>シリアル受信してセンサに反応してるかしてないかの判定して、コンソールでいいので出力するコードを実装します
    →arduino側でセンサに反応しているかの判定をして、unity側のスクリプトで出力するためのコードを書く
    ということで合ってますでしょうか。。

    すみませんがよろしくお願い致します。

    キャンセル

  • 2018/05/26 17:31

    それでもいいです。
    現状のコードでは、のべつまくなしにAD変換のデータを出力してますが、これでは反応してるかしてないかの判定をUnity側で判定する必要があります。
    これでも動作させるコードを組むことはできます、が
    反応するかしてないかをArduino側でさせて、反応しない>反応した、反応した>反応しない、という状態の変化のときだけ何らかのメッセージを送るようにすれば、通信量は激減しますし、あとのデバックはやりやすくなりますね

    キャンセル

+1

y_waiwai氏の回答にarduino側からコメントします。
まず人感センサーの仕様ですが、VCC(電源)の電圧の幅は仕様書を見る限り広く、人を検知したら’3V’を出力するものと理解しています。
従ってこれと氏の言われる通りにトラフィックを低減させるため人を感知した、関知しなくなったの状態変化したときにUNITY側でキーボードの押下の状態と同じようにキャラクターの入力がプログラムしやすいかと。
参考までにarduinoの簡単ソースを添付します。

#define in  A0
#define H   1
#define L   0
int    mode;
void setup()
{
    Serial.begin(115200);
    pinMode(in,INPUT);
    mode = L;
}
void loop(){
    int status;
    status = digitalRead(in);
    id(status == H){
        if(mode == L ){
            mode = H;
            Serial.print("H");
    } else {
        if(mode == H){
            mode = L;
            Serial.print("L");
        }
    }
}


これで状態変化したときだけシリアルに’H'(検知した)”L"(検知しなくなった)となり、これの代わりにキーボード入力で同じ文字を入れればデバッグしやすいかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/28 18:48

    回答ありがとうございます!
    こちらのコードでも試しにやってみようと思います、、!

    キャンセル

check解決した方法

0

学校の先生に相談してみてなんとか解決しました。。

アニメーションが変わるようにするコードに、シリアル通信をするためのコードを読み込ませなきゃいけないというのを教えていただきました。

y_waiwai様 、MasahikoHirata様
ありがとうございました、、!!
どちらもベストアンサーですので、高評価を付けさせていただいてます。

下記のものが最終的なコードになりました。↓

//arduino
void setup() {
  // put your setup code here, to run once:
 Serial.begin(115200);


}


void loop() {
  // put your main code here, to run repeatedly:
  int v = analogRead(0);
  Serial.println(v);
  delay(50);
}
//unity
//シリアル通信をするためのコード
using System.Threading;

public class SerialHandler : MonoBehaviour
{
    public delegate void SerialDataReceivedEventHandler(string message);
    public event SerialDataReceivedEventHandler OnDataReceived;

    public string portName = "/dev/cu.usbmodem14541"; 
    public int baudRate = 115200; 

    private SerialPort serialPort_;
    private Thread thread_;
    private bool isRunning_ = false;

    public string message_; 
    private bool isNewMessageReceived_ = false;

    void Awake()
    {
        Open();
    }

    void Update()
    {
        if (isNewMessageReceived_)
        {
            OnDataReceived(message_);
            print(message_);
        }
        isNewMessageReceived_ = false;
    }

    void OnDestroy()
    {
        Close();
    }

    private void Open()
    {
        serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);

        serialPort_.Open();

        isRunning_ = true;

        thread_ = new Thread(Read);
        thread_.Start();
    }

    private void Close()
    {
        isNewMessageReceived_ = false;
        isRunning_ = false;

        if (thread_ != null && thread_.IsAlive)
        {
            thread_.Join();
        }

        if (serialPort_ != null && serialPort_.IsOpen)
        {
            serialPort_.Close();
            serialPort_.Dispose();
        }
    }

    private void Read()
    {
        while (isRunning_ && serialPort_ != null && serialPort_.IsOpen)
        {
            try
            {
                message_ = serialPort_.ReadLine();
                isNewMessageReceived_ = true;
            }
            catch (System.Exception e)
            {
                Debug.LogWarning(e.Message);
            }
        }
    }

    public void Write(string message)
    {
        try
        {
            serialPort_.Write(message);
        }
        catch (System.Exception e)
        {
            Debug.LogWarning(e.Message);
        }
    }

}
//unity
//センサーの値を読み込んでアニメーションが変わる
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class set_animation : MonoBehaviour {

    Animator this_anim;
    GameObject serial_obj;
    SerialHandler serial_obj_handler;
    // Use this for initialization
    void Start () {
        this_anim = this.gameObject.GetComponent<Animator>();
        serial_obj = GameObject.Find("SerialHandler");
        serial_obj_handler = serial_obj.GetComponent<SerialHandler>();
    }

    // Update is called once per frame
    void Update () {

        if(int.Parse(serial_obj_handler.message_) > 400){
            this_anim.SetBool("start_jump", true);
            //Invoke("return_def", 3.0f);
        }

        if (int.Parse(serial_obj_handler.message_) == 0)
        {
            this_anim.SetBool("start_jump", false);



        }

       if (Input.GetKey("up")){
            this_anim.SetBool("start_jump",true);
            Invoke("return_def", 3.0f);
        }
    }

    void return_def(){
        this_anim.SetBool("start_jump", false);
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7121questions

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

  • Unity

    4006questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • C++

    3456questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Arduino

    539questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。