ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

No.002 進捗状況13[ジャンプする箱]

f:id:covory10101101276:20190428192104j:plain
シャウエン -モロッコ-

みなさんこんにちは🌚

では今回は現在進行中のプロジェクトの最後(の予定)のオブジェクトを作っていきたいと思います。次回以降はゲームの中身的なものを作っていきます。

ジャンプする箱
速く動いてやりたいスタイリッシュなことというわけで考えた結果、落ちる崖やガレキの上を飛んでわたるというアクションを実装することにしました。イメージとしては下の感じ

f:id:covory10101101276:20190428193353p:plain
FF7ACCはスタイリッシュさが詰まっててワクワクするなあ
まあ加速とは関係ないですがイメージということで

まずはいつも通りBoxを用意
目の前には飛び乗るためのジャンプパネルを配置
f:id:covory10101101276:20190428194940p:plain
さらに飛んで渡るためにボックスを連続して配置し、その上にジャンプパネル

f:id:covory10101101276:20190504181449p:plain
こんな感じ
この長いボックスはプレハブ化しておきます。そしてジャンプパネルはもうあるのでこのボックスの動きを制御するスクリプトを作成
f:id:covory10101101276:20190504181646p:plain
f:id:covory10101101276:20190504181807p:plain
重力の適用を遅くするという挙動はなかなか実装方法が思い浮かばなかったので代わりにこの箱のみRigidbodyではなくAddforceによる重力の実装をし、この値を変えることで重力の変化を表現しました。しかし絶対にもっと良い方法があるはずなので少し不満が残りますね。まあさっさと作るために今回は仕方ないです。また今度勉強しましょう。さあ動きを確認すると...
f:id:covory10101101276:20190504183758p:plainf:id:covory10101101276:20190504183815p:plainf:id:covory10101101276:20190504183828p:plain
だいぶイメージっぽい感じにできました!!無駄に3つのアングルから撮ってみました。
でもジャンプパネルに乗った時の挙動が一回ごとにやけに前に飛んだり逆に飛ばなかったり安定しないんですよね。一番健闘できた動きがこれなので今回はこれまでにしておきますがまだまだ改善の余地はありそうです。

No.002 進捗状況12[RPG的なメッセージウィンドウ]

f:id:covory10101101276:20190421111135j:plain
ラス・ラハス教会 -コロンビア-

みなさんこんにちは🌚

今回はオブジェクトではなく、RPGゲームでよくある会話ウィンドウを実装したいと思います。といっても、例によってこちらのサイトの方法を実践するだけなので、こちらをみてもらった方がとてもわかりやすいです。かめくめちゃんさんには毎回お世話になってます😊
gametukurikata.com
まずは最初にある通りキャンバスに色々配置。
f:id:covory10101101276:20190422174214p:plain
MobileJoyStickもキャンバスなんだけどいいのか。いや、とりあえずやってみよう。操作とメッセージは同時に表示しないからあとで切り替えれば大丈夫だろう
次にメッセージスクリプト作成。勉強のため中身を謄写することを試みましたがUpdate()メソッドの中で迷子になったためそこだけコピペしたのは内緒。
f:id:covory10101101276:20190422174700p:plain
f:id:covory10101101276:20190422174722p:plain
f:id:covory10101101276:20190422174744p:plain
これを全部手で写しましたなどと言えばコメントアウトまで綺麗に写したのかと褒められるか見破られるかの2択でしょう。
Updateメソッドの途中でこんがらがってしまったのですが用意した変数や他のメソッドの中身とサイトの記述から大体の仕組みは理解できたと思います。特に最後のSetMessagePanelはこのスクリプト内では呼び出されないものの他のスクリプトから呼び出す際に便利なよう設計されているのは勉強になりました。普通のことかもしれませんが私の中にはなかった概念です。

そしてこれを呼び出すゲームオブジェクトを作ります。
空のゲームオブジェクトに次のスクリプトをアタッチし、今回はmキーで会話を呼び出してみます。

f:id:covory10101101276:20190423101822p:plain
Input.GetKeyDownの中身だけ変える
実行してみると...
f:id:covory10101101276:20190423102401p:plain
できた!!
いやすごいですね。ですが今回作りたいゲームは縦画面なのでUIの構成とかを調整していく必要がありそうです。では今回はここまでにしておきます。

No.002 進捗状況11[NavMesh]

f:id:covory10101101276:20190418202157j:plain
氷河急行(グレッシャー・エクスプレス) -スイス-

みなさんこんにちは🌚

一口サイズに材料を切るのが苦手なブルーノです。

では今回も新しいオブジェクトを作っていきたいと思います。
ところで最近Youtube仮面ライダーカブトの動画を見たんですが、これも今私が作っているゲームと同じく時間を圧縮した中で敵との戦いを繰り広げるといった内容で、とてもかっこいいんですね。というか、このゲームの元ネタはぶっちゃけこの仮面ライダーカブトです。そして仮面ライダーには敵がつきもので、このカブトの敵も超高速で動くため常人には捉えられないんですね。というわけで、今回作るオブジェクトは「超高速で動き回る敵」にしたいと思います。そして動かす敵は、街を作った際にノリでストアから手に入れたこの人にしようと思います。
f:id:covory10101101276:20190418210130p:plain
にしてもなんでこのゴリラおしゃぶりしてるんだろう。では頑張っていきます。

NavMesh
昔Unityの勉強の記事で少しだけ触れたNavMesh、自動で歩ける道を判別しその上をAIが勝手に動いてくれるという代物を今回は使いたいと思います。こちらのサイトを参考にしました。というか、まんまこのサイト通りです。毎回お世話になっています。kanさん。
kan-kikuchi.hatenablog.com

まずはテスト用のフィールドと、ゴリラを配置。
f:id:covory10101101276:20190418211033p:plain
Window→AI→Navigationを開き、Objectタブから歩かせたいエリアに該当するオブジェクトを選択し、NavigationStaticにチェック。
f:id:covory10101101276:20190418211618p:plain
NavigationAreaは[Walkable]を選択しておきます。
f:id:covory10101101276:20190418211709p:plain
準備ができたらBakeしましょう。

f:id:covory10101101276:20190418211859p:plain
ここでも足場の設定が色々できる模様
そしたら今度は、ゴリラにNavMeshAgentというコンポーネントをつける。これだけ。なんて簡単なんだ。
f:id:covory10101101276:20190418212605p:plain
動きを速くするため、SteeringのSpeed, AngulerSpeed, Accelerationを、アホみたいに速くしてみました。これらはそれぞれマリカでいうスピード、曲がりやすさ、加速ですね。
あ、さきほどこれだけと言いましたが、最後にスクリプトから目的地を設定してあげる必要がありました。嘘ついてごめんなさい。
しかし目的地の設定も、NavMeshAgent.destinationにVector3型の座標を指定するだけ。そこで今回は、目的地をこんなオブジェクトにしてみました。
コライダー だけのCubeを用意し、時間経過もしくはゴリラが触れることで特定の座標を移動する目的地です。
f:id:covory10101101276:20190418213826p:plain
f:id:covory10101101276:20190418213916p:plain
これでゴリラが常にある目的地を目指して走り出すはず.....とおもったんですが......
f:id:covory10101101276:20190419184342p:plain
ゴリラが恥ずかしいことになったまま走り回ってるんですが.....原因を調べてみると、どうやらこのアセットにもともとついていたAnimationが、NavMeshと競合してしまっているようです。
NavMesh Agent を他のコンポーネントと共に使う - Unity マニュアル
NavMeshAgentは独自のPhysicsとAnimationコンポーネントを持っているらしく、そのまま一緒に使うと競合を起こしてしまい正常に機能しないようです。ちなみに競合というのは複数のプログラムなんかが同じデータを使おうとして競り合ってしまうことです。まあゴリラがブルブルするアニメーションは今回いらないのでアニメーションは今回は捨てることにしました。Animationコンポーネントを外すと...
f:id:covory10101101276:20190419185449p:plain
直りました。が、今度はまた別の問題が。ゴリラが速すぎてプレイヤーの当たり判定が貫通してしまいました。
f:id:covory10101101276:20190419192152p:plain
どうやらこれは物理演算の関係上速い動き全てを計算すると負荷がかかってしまうのでコマ送りになってしまっているそうです。というのも全てこちらのサイトに書いてあったんですよね笑
【Unity】物理演算で動かすオブジェクトが壁を貫通する問題と対策 - テラシュールブログ
というわけでゴリラにRigidbodyコンポーネントをつけてCollision Detectionを[Continuos Dynamic]にします。ちなみにIs KinematicにチェックをつけないとNavMeshAgentと競合を起こします。
f:id:covory10101101276:20190419193117p:plain
そして...
f:id:covory10101101276:20190419193331p:plain
Debug.log()メソッドでゴリラの衝突を確認
成功しました。今回はここまでにしておきます。

No.002 進捗状況10[オブジェクトプーリング][ビルボード]

f:id:covory10101101276:20190415125226j:plain
グヌン・ムル国立公園 -マレーシア-

みなさんこんにちは🌚

ステファノス・チチパスってなんか口に出したくなっちゃうよね。ブルーノです。

では今回もオブジェクトを製作していきます。
今回作ろうと考えたのはズバリ「雷」。雷を避けるなんてかっこいいですよね。というわけでこれを作成していこうと思います。
雷ってぐにゃぐにゃしてるから3Dモデルを用意したらその表現がとても難しいしめんどくさそうですよね。というわけで今回はまずこの雷の表現に「ビルボード」という技法を使いたいと思います。

ビルボード
ちょっと昔のゲームをやっていると時々かなりグラフィックが写実的なのにどこからみてもその面しか見えないオブジェクトとかありますよね?

f:id:covory10101101276:20190415130319j:plain
コース脇の木々はみんなカメラを向いている
これはビルボードという技術で2Dの見た目のものを常にカメラの方を向かせることで立体感を出す技法で、3Dモデルの節約ができます。
nn-hokuson.hatenablog.com
こちらの方がとても詳しく解説しています。というかこれ見て作りました🌝
まずは背景を透過させた雷の画像をインポート
f:id:covory10101101276:20190415131156p:plain

背景の透過仕方は
mtimsno.hatenablog.jp
こちらに詳しく載っています。

そして新しく作ったQuadオブジェクトに適用。名前はLightningにしときました。

f:id:covory10101101276:20190415131259p:plain
見た目はこんな感じ。雷っぽいがペラペラ
見た目はペラペラですがコライダーは普通にCapsule Colliderを使っているので当たり判定はあります。
そしてビルボードスクリプトを作り、Lightningにアタッチ。
f:id:covory10101101276:20190415131617p:plain
なぜか裏面がどうしてもこっちに向いてしまったのでLookAt()のあとに180度回転

f:id:covory10101101276:20190415131954p:plain
シーンビュー(上)と実際のゲームビュー(下)
常にカメラの方を向くようになりました。良かった良かった。

しかしこの雷、実際に光を発しているわけではないので日陰だととても暗くなってしまうんですよね。

f:id:covory10101101276:20190415132320p:plain
暗い。まるでスルメ

オブジェクトへの光の当たり具合や見た目の影響を管理するのはマテリアルのエミッション(Emission)が関係しているようなのですがこちらのサイトを参考にしてみたもののUnityのバージョンが違うためかメニューが変わっていて記事通りにいかなかったです。
[Unity]色を失わないオブジェクト | KENスクールブログ

f:id:covory10101101276:20190415132651p:plain
実際のマテリアルのEmissionの欄。サイトとは違う項目になっている
しかたないのでオブジェクトの目に前に光源を置くという強硬手段に。
f:id:covory10101101276:20190415132849p:plain
なんか結構いい感じなので結果オーライ
そして下に降る動きと地面の下に入ったら消えるようスクリプトで制御します。ちゃんとタイマーで遅くできるようpublicなスピードの値も導入。ただ落ちるだけだと物足りない気もしたので34行目で地面に落ちた時に光っぽいパーティクルも発生させました。
f:id:covory10101101276:20190415133119p:plain
しかし、これが後述するオブジェクトプーリングというあらたな壁に大きく関わってくることになるのです。

オブジェクトプーリング
さあさっき作ったLightningを生成するスクリプトを作ってたくさん雷を降らせるぞーと思い、こちらのジェネレータースクリプトを作ったところ....

f:id:covory10101101276:20190415133932p:plain
タイマーリセットと座標リセットをそれぞれ別メソッドで作ってUpdate()メソッドを見やすくしたぞ。我ながら玄人っぽいじゃないか😏

f:id:covory10101101276:20190415134225p:plain
お、重い。。。。
全くゲームプレイができないわけではないですが結構な頻度で画面が角つきました。パソコンでこれならスマホはどうなってしまうんだ....
どうやら先ほどスクリプト内で頻出していたInstantiate()メソッドが原因で、新たにオブジェクトを生成する作業は負荷が大きいそうです。でもこの量でもこれだけカクつくのにシューティングゲームとかはどうやってあれだけの弾を動かしているのでしょうか。
そこでオブジェクトプーリングという技法の出番というわけです。
【Unity】オブジェクトプーリングでオブジェクト節約術 | Unity | DoRuby
こちらのサイトを参考にしました。どうやらオブジェクトをゲーム開始時にたくさん作っておき、そのアクティブ/非アクティブを切り替え使い回す方法のようです。なるほど。
では実際にスクリプトを書いていきます。var型とかforeachとか自分では全然使わないから理解が大変だ😵😵😵
f:id:covory10101101276:20190415135250p:plain
オブジェクトプールのスクリプトはリストの生成と取り出し周りだけなので全く同じ記述で良いですね。
f:id:covory10101101276:20190416164208p:plain

f:id:covory10101101276:20190416164226p:plain
雷生成スクリプト
こちらの雷生成スクリプトは大幅な変更が余儀なくされましたが、おかげでオブジェクトプールの仕組みと使い方がよくわかりました。使用する際はGetObject()メソッドのみなので楽ですね!
f:id:covory10101101276:20190416164435p:plain
f:id:covory10101101276:20190416164447p:plain
雷自身のスクリプト
一応雷のスクリプトもオブジェクトプールの仕様により用済みになったら非アクティブにするように変更。このスクリプトの22行目で世界時間をかけているので加速に伴って雷のスピードが1/10になるのは当然なのですが雷の生成も遅くなるように前の雷生成スクリプトの51行目でも工夫してあります。
結果は....
f:id:covory10101101276:20190416164848p:plain
成功!!
雷の中を加速して避けるのはなかなか面白いですよ。さあゲーム内容が面白くなってきた!!今回はここまでにしておきます。

No.002 進捗状況09[ワープするチェックポイント]

f:id:covory10101101276:20190306183656j:plain
ペルー/クスコ -レインボーマウンテン-

みなさんこんにちは🌚

隻狼というゲームが気になっているもののゲームしている暇もお金もなくて動画をみてしまいたい欲と葛藤するブルーノです。ゲーム動画って100%ネタバレだから見るかどうかすごく悩みます。

では前回に続き今回は通過したら次の地点まで移動して現れるタイプのチェックポイントの作成に移りたいと思います。

前回のものとの違いは

  • 触れてもオブジェクトは消えない
  • 出現するための座標・角度を複数格納できる
  • 触れると次の指定された座標に再び現れる(最終地点の場合は消える)

といったところでしょうか
このチェックポイントは前回のCheckPoint02の中身を改良してその結果を分岐させようと思います。

f:id:covory10101101276:20190412183109p:plain
f:id:covory10101101276:20190412183114p:plain
f:id:covory10101101276:20190412183119p:plain
長くなってしまいましたがようやくできた...!!
本当に時間がかかってしまいました。この記事の投稿が遅れた原因の8割はこのスクリプトで詰まっていたからといっても過言ではないです。気分転換すると突然解決策が浮かぶことってありますよね。
当初の予定通り、次に現れる位置と向きを格納する配列を2つ作り、コライダーがプレイヤーに触れると次の予定された座標に移動、回転し、もし次の座標がなければクリアフラグを立てる。といった風になりました。
52行目のMoveCheckPoint()関数はアニメーションから呼び出しています。今回はこのアニメーションの途中で関数を呼び出せることを学ぶことができました。

f:id:covory10101101276:20190412185739p:plain
左の同じ形の+マークから関数を追加できる
結果は。。
f:id:covory10101101276:20190412184734p:plain
成功!!
回転もうまく反映させてることがわかるようにイーサンに対して違う向きを向いている写真を撮ってみました。イーサンも感動のあまり立ち尽くしてますね。

試行錯誤の途中はアニメーションが変なことになったりスクリプトが無駄に3枚に増えたり大変でした。こうして一つのスクリプトに収められたのはとても良かったです。

オブジェクト一つ作るのにこれだけ時間がかかってしまうのはとてもまずいですね。もっと簡単な形にしてペースを上げていこうと思います。

No.002 進捗状況08

f:id:covory10101101276:20190220112119j:plain
Lion Sands hotel -南アフリカ-

みなさんこんにちは🌚

キングダムハーツ3やApex Legendsに最近はまっていてPS4の家庭内勢力がSwitchを上回ってきているブルーノです。PSの圧倒的なグラフィックは定期的にみたくなりますね。

では今回もオブジェクトを制作していきます。

移動するチェックポイント
今回はキャラが触れた時に消えるようないわゆるチェックポイントを作りたいと思います。イメージとしてはゼルダの伝説ブレスオブザワイルドの光の輪くぐりの感じです

f:id:covory10101101276:20190220112702j:plain
こんな感じ
まず簡単に見た目だけ作ります。
f:id:covory10101101276:20190220113052p:plain
空のオブジェクト置いて
f:id:covory10101101276:20190220113120p:plain
子にキューブ5個置いて
f:id:covory10101101276:20190220113147p:plain
いい感じに配置
この中をくぐることにします。
そして今置いたオブジェクトたちにはデフォルトでコライダーがついていますが彼らにぶつかる必要はあまりないので取り除き、逆に空のオブジェクトに適当なコライダーを通過した判定のため追加しておきます。
f:id:covory10101101276:20190220113917p:plain
空のオブジェクトはCheckPointにし、コライダーをつけました
f:id:covory10101101276:20190220114107p:plainf:id:covory10101101276:20190220114121p:plain
大きさを変更し、Is Triggerにチェックをつけます。これで物理的な干渉をせずに当たり判定を行うことができます。
今回実装する感じとしては

  • ただ触れた瞬間に消える。
  • 座標を格納する変数を任意の数指定し、触れたら次の座標に現れる

という二つの方法を考えつきました。
後者はまんまゼルダのイメージですね。実装が簡単なのは間違いなく前者ですが、今回は両方作りたいと思います。
触れた瞬間に消える
これは簡単ですね。コライダーが当たりを感知したらDestroyするようにすればOKです。が、いきなりパッと消えると変なのでアニメーションでとても小さくしてから消します。
dreameaters5239.hatenablog.com
アニメーションの参考過去記事

f:id:covory10101101276:20190305042851p:plain
アニメーションを作成
f:id:covory10101101276:20190305043050p:plain
CheckPointAnimationの中身
わかりにくいですが、0.3秒でちょっと大きくなり、0.5秒までで小さくなって消えるアニメーションです。
f:id:covory10101101276:20190305043243p:plain
CheckPointScriptの中身
こんな風にスクリプトを書いてみました。ついているAnimatorの取得とコライダー反応時にアニメーションを再生する動きのみとりあえず記述です。再生してみると
f:id:covory10101101276:20190305044107p:plain
一応できたのですが、アニメーションがループ再生してしまいました。
f:id:covory10101101276:20190305044345p:plain
アニメーションファイルのLoop timeに
チェックがついているのが原因でした
これでアニメーションの方はOKですが、まだオブジェクトを消す事と触れたことを知らせるフラグを実装することが残っています。というわけでスクリプトを改良します。
アニメーション後にオブジェクトを消す
簡単そうに思えましたが意外にネットに方法がなかったので、アニメーションウィンドウにあったこれを利用してみました。
f:id:covory10101101276:20190305214635p:plain
アニメーション内でスクリプトのアクティブ化・非アクティブ化を操作できるみたいです。これでオブジェクトを消す下のスクリプトを有効化します。
f:id:covory10101101276:20190305214646p:plain
中身はこれだけ
フラグについて
ゲームにおいてフラグというのは欠かせない存在ですよね。しかしこのフラグ、どういう風に実装するのがゲーム作りにおいて主流なのでしょうかね。独学なのでいまだによくわかりません。今回はこのCheckPointScriptの中でbool値を操作し、ゲームシステムのスクリプトでそれを検出するという風にしようと思います。
f:id:covory10101101276:20190305215923p:plain
Checkedというbool値を追加しました
これで検出できるはずです。記事が長くなるので今回はここまでにして次回移動する機能の実装を作りたいと思います。

キングダムハーツ3のシークレットムービー、気になる内容ばかりでしたねえ〜〜😄結局黒い箱とマスターオブマスターは出てきませんでしたが、次回で深く関わってきそうですよね。Verum Rexの存在も新しく今後に関わってくるような描写もあってせっかくゼアノートを倒したのにもう世界観が広がりまくりでソラたちの冒険は終わらなそうです。まだまだキンハーは楽しめるコンテンツとして続きそうで楽しみです😍

No.002 進捗状況07

f:id:covory10101101276:20181115204153j:plain
フィリピン -ビガン-

明けましておめでとうございます🌚

といってももう2月ですね。新元号は一体何になるのでしょうか。この年末年始は卒論に追われてゲーム制作どころじゃありませんでしたが😭また再開していこうと思います。というわけで今回の進行具合のレポートを残します。

床の整備
いきなり地味な内容なんですがプレイヤーキャラの挙動を実装した時に街中を走って試運転しているとよく何もないところで飛び跳ねたりするのが気になって原因を調べてみました。

f:id:covory10101101276:20190131192414p:plain
なんもないところでとびはねちゃう。
どうやら原因は街作りのために敷き詰めた道路の継ぎ目らしく、同じ高さで座標をぴったり隣に合わせたとしても隙間が判定されてしまいAirboneのアニメーションに移ってしまっていたようです。そこで道路関係のオブジェクトのコライダーを全て無くして見かけだけにし、かわりに透明の大きなPlaneを街の床に配置しました。
f:id:covory10101101276:20190131192933p:plain
大きな透明の足場「Foot Step」
縁石などの地味な高低は無視されますが、いちいちここにつまづいても面白くなさそうなのでちょうど良かったです。なにより各道路のオブジェクトに適用していたMesh ColliderやBox Colliderを消したことで動作が軽くなったことが個人的にとても嬉しいです。

ステージギミックの制作
プレイヤーだけでは面白くないので他ステージギミックを作りたいと思います!どんどん足していきましょう。

ジャンプ台
やっぱり3Dアクションならジャンプできるギミックがないと!ジャンプボタンでの能動的なアクションの実装も考えたのですがGUIがごちゃごちゃするのがいやなのでステージギミックという形で実装します。

f:id:covory10101101276:20190131203311p:plain
Planeをおき名前を「Jump Panel」に
f:id:covory10101101276:20190131203400p:plain
こんな感じのスクリプトをJump Panel にアタッチ
f:id:covory10101101276:20190131203537p:plain
ジャーンプ!

クリアシンボル
ゲームをクリアする条件として特定のオブジェクトを全てもしくは一定以上集めるという形式をとりたいのですが以前作ったコイン以外にもそういったオブジェクトを設けたいのでまた別に作成したいと思います。また、応用が利くように2D画像をそのオブジェクトのレンダラーにしてレパートリーを増やします。

f:id:covory10101101276:20190212163616p:plain
Quadを置く
f:id:covory10101101276:20190212163818p:plain
コライダーをメッシュではなくbox coliderにしておく
この時sizeがquadに合わせて薄っぺらくなっているので全ての値を1にしてとりあえず直方体にしておく

nn-hokuson.hatenablog.com
そしてこちらのサイトを参考に常に画像がカメラを向くビルボードを実装する

f:id:covory10101101276:20190212174841p:plain
こんな感じ
元サイト様のposition.yの行を入れてしまうと上下のはんてんができなくなってしまうので今回は不適切です。元サイト様のように木などの上下には動いて欲しくないオブジェクトの場合は使えます。

最後に画像を拾ってマテリアルをQuadに適用すれば

f:id:covory10101101276:20190212175140p:plain
常にこっちを向く!!
ゲームオブジェクトっぽいものができました。lookatメソッドだけで良かったんですね。あとはこの中身の画像を入れ替えれば様々な用途で使用できそうです。以前のコインもこれで良かったんじゃん。。。まあ勉強ですね!今回はここまでです


この記事を書いている間に年が明けてしまい投稿までに1ヶ月もかかってしまいました。この内容に関わることで時間がかかっていたわけではないのでプロジェクトは進んでいませんがペースが明らかに落ちていますね。頑張っていきたいと思います。