相棒のようなキャラクターをスクリプトでつくる ( Partner AI )


## はじめに
![無題のプレゼンテーション (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2241831/96293932-6ae4-51d8-6f38-7dad27318519.jpeg)


こんにちは。はじめまして。現在、今年新卒で入社したゲーム会社でエンジニアをしているhattoriです。会社ではゲームプレイ(主に戦闘)・AIの実装しています。個人開発ではキャラクターの動きの自動生成の開発に取り組んでいます。

今回の記事では相棒のようなキャラクターAIをスクリプトでつくることについてご紹介させていただきます。
**なぜ相棒か？　 
    → プレイヤーとキャラクターがいる中でのコミュニケーションに興味があり、それを生み出しやすいからです。**
(Pythonを使って相棒を連れて色んなワールドを巡れるようなことも考えていました)
自分はキャラクターがワールドで生活しているような生き生きとした空間が好きで、昨年のアドベントカレンダーではclusterに生活するキャラクターAIとそれで生まれるコミュニケーションについての記事を書きました。詳しくは下記記事をご覧ください。
https://qiita.com/hattori88/items/29781a8361ab830cd9e7
今回、具体的には **スクリプトで自律的に動く「犬」をつくってみます。** 興味のある方の参考になれば幸いです。

普段ワールドをつくっている方は、キャラクターの喜怒哀楽や特徴的な行動でその場の雰囲気がかわる小さなワールドととらえるとつくりやすいかもしれません。

また、今回の記事は私個人による見解だけではなく、ネットで調べて得た情報や勉強会・イベントで教えて頂いた情報も含んでいます。ご了承ください。


### 目次
- スクリプトで「犬」をつくる 
    - 公開したワールド、作成したコード、使用したアセット
- もう１つのスクリプト
   
## スクリプトで「犬」をつくる

### 公開したワールド、作成したコード、使用したアセット
公開したワールド
https://cluster.mu/w/3e01f94a-d1d1-4684-adec-923a5e10f03e
作成したコード
```javascript:PartnerAIManager.js
// 性格
// １：わんぱく　(今回は、睡眠・飛び跳ねるをするキャラクターとします。)

// 感情 （外部からの影響によって変化します ※今回は省略）
let emotinons = ["joy", "anger", "sorror", "comfort"]

// 気分　(性格によって基本攻勢を定義します。感情によっても変化しますが、行動を選ぶ条件となっています)
$.state.feeling = "relax";

// 気分の変化する時間感覚です。
$.state.nextFeelingInterval = 5;

$.onUpdate(deltaTime => {
    $.state.time += deltaTime;

    if($.state.time < $.state.nextFeelingInterval) return;
    $.state.time = 0;

    $.setStateCompat("this", "go", false);

    // 気分を条件にして動きを決定します。
    switch ($.state.feeling) {
        case "relax":
            $.log("relax");
            $.sendSignalCompat("this", "Sleep");
            $.state.nextFeelingInterval = 5;
            $.state.feeling = "normal" 
            break;

        case "highTension":
            $.log("highTension");
            $.sendSignalCompat("this", "Jumping");
            $.state.nextFeelingInterval = 3;
            // 次の気分を決定します。
            let nextFeelingDicisionNum = Math.random();
            if(nextFeelingDicisionNum <= 0.5){
                $.state.feeling = "normal";
            }
            else {
                $.state.feeling = "wantWalk";
            }
            break;

        case "wantWalk":
            $.log("wantWalk");
            //$.setStateCompat("this", "go", true);
            //$.setPosition();
            $.sendSignalCompat("this", "Walk");
            $.state.nextFeelingInterval = 3;
            $.state.feeling = "normal";
            break

        default:
            $.log("normal");
            $.sendSignalCompat("this", "Idle");
            $.state.nextFeelingInterval = 3;
            // 次の気分を決定します。
            let nextFeelingDicisionNum = Math.random();
            if(nextFeelingDicisionNum <= 0.3){
                $.state.feeling = "wantWalk";
            }
            else if(nextFeelingDicisionNum <= 0.6){
                $.state.feeling = "highTension";
            }
            else if(nextFeelingDicisionNum <= 0.9){
                $.state.feeling = "relax";
            }
            else{
                $.state.feeling = "normal";
            }
    }
});
```
使用したアセット
https://assetstore.unity.com/packages/3d/characters/animals/mammals/oscar-the-dog-quirky-series-119972
![スクリーンショット 2022-12-01 12.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2241831/ecb97f6e-d96f-0e88-2c0c-3de8d22ab9df.png)


説明は追記します...!
## もう１つのスクリプト
スクリプト言語であるPythonを使えば、相棒と一緒にワールド巡りできる！って書こうと思っていました...
妄想は膨らんでいたので、項目だけ紹介すると
- 人・モノを認識できる物体検知
- clusterを操作(キーボード：PyAutoGui、マウス：Win32API)
- 意思決定・感情表現 (Pythonでかく)
をすることで、プレイヤーの代わりに操作できるようになると思います。
物体検知は難しいのですが、プレイヤーのアイコンや特定のオブジェクトを認識できるとかなり表現が豊かなキャラクターになると思っています。

## おわりに

ここまで記事を読んでくださりありがとうございます。昨今のAIの自動生成の盛り上がりがあり、現実で自由に生きているようなキャラクターの登場もそう遠くはないと思っていますが、今現在は技術的にハードルがあり、まだまだ生活を共にするようなキャラクターの存在可能性が低いとも思っています。clusterで生活をしていると、**「仲の良い人がつくったからこそ遊びに行きたいワールド」** と感じることがあるのですが、それと同じように、**「仲の良い人がつくったからこそ存在してほしいキャラクター」** と思うことは少なくないはずだと思いました。それにキャラクターの存在可能性を感じています。
色んな人が**ワールド**だけではなく、いたら良いかもしれないと思った**キャラクター**をつくりやすくなれればなと思っています。
これをきっかけに自分が好きなキャラクターを考えたり、つくったりする人が増えたら嬉しいです。

明日はvinsさんの「たぶんスクリプト関係を。」です。スクリプトを使う際、vinsさんの記事を参考にしていたのでその信頼感も含めてより楽しみです。