norablog-techのブログ

このブログは、自分の忘備録的にアウトプットするためのブログとなっております。

「Python 3 エンジニア認定データ分析試験」に合格しました。学習ノート公開。

先日、PythonEDの「Python 3 エンジニア認定データ分析試験」に合格しました。

PythonED様のWebサイトに合格体験記も載せていただいてます。

https://www.pythonic-exam.com/archives/10114

 

体験記内にも言及していますが、教科書の内容を自分の言葉でまとめたノートを作成し、それをVOICEVOXの「四国メタン」ちゃんに読み上げてもらった音声をスマホに入れて、通勤中に聞き流していました。

 

そのノートを公開します。

著作権上問題にならないよう、抜き書き、コピペはしていないつもりです。

また、「第4章 ライブラリによる分析実践」以降は省略します。

試験には、教科書では解説されていないコマンドが多数、出題されます。それに関しては、各社の模擬試験の活用をお勧めします。

Pythonはライブラリのバージョンアップが早く、依存性があり、私が使った「第2版」でも教科書通り記述してもエラーになってしまう場合がありました。

※すでに第3版が出ています。

 

 

〇まとめ
 
1.データエンジニアの役割
 
〇データ分析を取り巻く状況
・オープンデータ基本方針
‐政府、地方自治体から多くのデータが”機械判読可能な形で無料で配布
 
〇データ分析におけるPythonの役割
 
Pythonの特徴
・言語としての使用が分かりやすい
・豊富なヒュジュンライブラリと外部パッケージ
・データ分析以外にも応用範囲が広い
・オ-プンソース
 
Pythonの得意分野
・サーバ系ツールFG
・Webシステムの構築
・IoTデバイスの操作
・3Dグラフィックス
 
Pythonが苦手な分野
・Webアプリのフロントエンド
・デスクトップGUI
・速度向上のための低レイヤー処理
・超大規模かつミッションクリティカルな処理
 
Pythonのデータ分析ツール
・JupyterLab
・NumPy
・pandas
・Matplotlib
・SciPy
・scikit-learn
 
Python以外
‐統計、データ分析、機械学習
Excel
GUIVBA
Java、その他の汎用プログラミング言語
‐ライブラリ、サンプルが少ない
 
〇データサイエンティスト
・数学、情報工学、対象分野の専門知識(ドメイン知識)の3分野の知識が必要
・データ分析、データ解析の一連の処理、理解・評価を行える立場の職種
〇データサイエンティストの役割
・モデルやアルゴリズムの構築
・新たな解法や新技術への取り組み
・解決したい課題に向き合う実務
・データとの向き合い方の提示
・分析結果の評価
 
〇研究分野と実務の違い
・研究分野:新たな解法や新技術への取り組みを重視
・実務:解決したい課題に向き合うことを重視
 
〇データ分析エンジニア
・データ工学を実践する1つの職種
 
〇データ分析エンジニアが持つべき技術
・データの入手や加工などのハンドリング
・データの可視化
・プログラミング
・インフラレイヤー
 
〇データ分析エンジニアが付加的に持つべき技術
・数学
・対象分野の専門知識(ドメイン知識)
 
〇データハンドリング(前処理)の重要性
・業務の8,9割を占める
・データの入手、再加工、つなぎ合わせ、可視化など
・データソースの探索
・データの正規化などの加工
 
・大量のデータからモデルを作成。カテゴライズや数値予測を行う
・データとアルゴリズムを元に内部パラメータを順次更新して、機械学習のモデルを作り上げる
・入力したデータ以外の未知のデータで数値予測やカテゴライズを行う
※モデル:機械学習アルゴリズムによる予測を行う計算式の塊
 
機械学習アルゴリズムを用いない予測を行う方法
・ルールベース:いくつかの条件(パラメータ)の組み合わせでルールを作成して予測
・統計的な手法:データから統計的な数値を求めて、それに沿うように予測する
 
機械学習のタスク
 
教師あり学習(Supervised Learning)
・正解となるラベルデータが存在する
・正解ラベル以外のデータを元に、正解に近い値を予測することができる方式
機械学習教師あり学習は、説明変数が目的変数をうまく予想するような、内部パラメータをコンピュータが求めること。
 ※正解ラベル(目的変数):タスクとなる課題に対して目的になる値
 ※説明変数(特徴データ/特徴量):目的変数以外のデータ
・回帰:正解ラベルが連続値
・分類:目的変数がカテゴライズされているデータ(連続値ではない)
例)二値分類、多値分類
 
教師なし学習(Unsupervised Learning)
・正解ラベルが存在しない学習方法
クラスタリング:与えられたデータの中からグルーピングを行う
・次元削減 :大量なデータの種類(説明変数の次元数)を、より少ないデータの種類(次元数)で表す
 計算しやすい数まで説明変数(次元数)を減らす
 
ブラックボックス的な環境下で、エージェントが得られる報酬を最大化するような状態に応じた行動を学習していく手法
例)囲碁、将棋、ロボット、etc
 
機械学習の処理の手順
・データの入手
・データ加工
・データの可視化
アルゴリズムの選択
・学習プロセス
・精度評価
・試験運用
・結果利用
 
 
・データの入手:利用できるデータを探しで入手、概要を把握 (NumPy、pnadas)
・データ加工(初期加工):データ型を整える、データの連結、欠損値への対応 (NumPy、pnadas)
・データの可視化:表やグラフで確認 (pandas、Matplotlib)
アルゴリズムの選択:目的、データに沿ったアルゴリズムの選択 (scikit-learn)
・学習プロセス:アルゴリズムを基にモデルを学習。ハイパーパラメータを設定 (scikit-learn)
・精度評価:正解率、適合率、再現率、混同行列などから、モデルを評価 (scikit-learn)
・試験運用:評価→再実行の繰り返し(統計的手法、数値化)、実業務に向け最終的に評価
・結果利用:実業務への適用、運用。引き続き、予測精度の継続的な評価、データの追加による学習を行う
 
〇外部パッケージ、サードパーティー製パッケージ
・JupyterLab:Webブラウザ上でPythionなどのコードを実行できる環境
・NumPy:数値計算用。配列や行列、ベクトルを扱える
・pandas:DataFreme構造(表形式)を扱える
・Matplotlib:データ可視化、折れ線グラフ、ヒストグラムなどを描画できる
・scikit-learn・機械学習アルゴリズムや評価ツールが集まったパッケージ
・SciPy:科学技術計算をサポート
 
 
2.Pythonと環境
 
  2-1 実行環境構築
〇Download Python
・各OS(Windows,Mac)用のインストーラを使う
 
〇venv:Pythonの仮想環境
・プロジェクトごとの仮想環境を作成、必要となるパッケージのバージョンを指定してインストール
python -m venv 名称
・./Scripts/Activate.ps1 ※開始(有効化) activateだけでも可
・deactivate ※終了(無効化)
・仮想環境が不要になった場合、ディレクトリごと削除すればよい
 rm -r -fo 名称
 
〇pipコマンド
 パッケージのインストールするコマンド
 PyPI - the Python Package Indexサイトで公開されている
・pip install パッケージ名
 ※バージョン指定もできる
 pip install パッケージ名==バージョン
・pip uninstall パッケージ名
・Update
 pip install -U パッケージ名
・パッケージの一覧取得
 pip list ※インストールされているパッケージ、バージョン一覧
・新しいバージョンのあるパッケージの一覧表示
 pip list -o
 
〇複数環境でのパッケージ・バージョンの統一方法
・pip freeze > requirements.txt -> インストールされているパッケージの一覧
・pip install -r requirements.txt
 
・データサイエンスで使用するライブラリを同梱している。
・condaコマンドでインストールするほうが良い
・Anacondaサイトからインストーラをダウンロード
 
 
  2-2 Pythonの基礎
Pythonの文法
・設計思想:「シンプルで読みやすいコードが書けること」
・インデント;ブロック構造を表現
・PEP8:コーディング規約
・pycodestyle:コーディングチェックツール
 (env)$ pycodestyle ソースコード(.py)
・Flake8:使用していない変数、モジュール、論理的なチェックを行うツール
 (env)$ flake8 ソースコード(.py)
 
 
2-2-2 基本構文
〇IPython
・[TAB]による補完
・自動インデント
・オブジェクトの後ろに?を付けると、オブジェクトの説明を表示
・%で始まるマジックコマンド
・!によるシェルコマンドの実行
 
〇条件分岐と繰り返し
・for 変数 in 繰り返し可能オブジェクト:
if:
実行式
else
実行式
 
〇例外処理
・try:
実行式
 except 例外
実行式
 
〇内包表記
※リストやセットを簡潔に生成する機能
・リスト内包表記:[len(name) for name in names]
・セット内包表記:{len(name) for name in names}
・辞書内包表記 :{name:len(name) for name in names}
 
〇ジェネレーター式
※リスト内包表記と同じ書き方を()で定義する
※値を1つずつ返すジェネレーターを生成する。メモリの負荷を軽減できる。
・g = (x*x for x in range(100000))
  next(g),next(g),next(g) #値を順番に取り出せる
 
〇ファイルの入出力
・open ※閉じ忘れを防ぐためeith文を使う
 with open('sample.txt','w',encoding='utf-8') as f: #ファイルの書き込み
  with open('sample.txt',encoding='utf-8') as f: #ファイルの読み込み
 
  f.write('文字列') ←書き込み
  data = f.lead() ←読み込み
  data ←呼び出し(表示)
  文字列 ←表示
・確認方法
 f.closed ←ファイルが閉じているか?
  True ←真(閉じている)
 
〇文字列操作
・文字列(f)を変換
 f.upper() ←すべて大文字
  f.lower() ←すべて小文字
  f.title() ←単語の初めだけ大文字
 
・置換
 f.replace('被置換単語','置換単語') ※被置換単語を置換単語で置き換え
 
・文字列(s)を指定文字で分割
 s.split() ←空白文字で分割
 
・文字列の左右(行頭、末尾)の指定文字を削除
 s.strip() ←空白文字を削除
 
・文字列の末尾をチェック(True,False)
 s.endswith('チェックする文字')
 
・文字列か数値かをチェック
 s.isdigit() ←文字列sをチェック。数値ならTrue
 
・文字列の長さを取得
 len(s) ←文字数が表示される
 
・文字列内に任意(指定した)文字列(xx)が存在するか(True,False)
 'xx' in 文字列
 
・文字列を指定文字で連結
 '-'.join(['A','B','C']) ※1'-'で連結
  'A-B-C'
 
・フォーマット済み文字列リテラル(f-string)
 文字列リテラルの先頭に接頭辞fまたはFを付け、波括弧{}の中に記述した変数や式の結果に置き換えられる
name,lang = 'takanory','python'
f'{name}は{lang}が好きです'
f'{name.title()}は{lang.upper()}が好きです'
f'{name=}は{lang=}が好きです'
 
 
2-2-3 標準ライブラリ
 
正規表現モジュール
 
・reモジュール
 import re
  prog = re.sompile('(P(yth|Z)o[pn]e?') #正規表現オブジェクトを生成
 prog.serch('Python') #マッチする場合はmatchオブジェクトを返す、しない場合はNoneを返す
 
 <re.Match object; span=(0, 6), match='Python'>
 
〇loggingモジュール
※ログを出力する。
 ログレベルを指定、任意のファイルにフォーマットを指定してログに出力できる。
 ログレベルはWORNING(警告)以上
 
import logging
 
logging.basicConfig(
    filename='example.log', #出力ファイルを指定
    level=logging.INFO,  #ログレベルを指定(INFOより重要なものを出力)
    format='%(asctime)s:%(levelname)s:%(message)s'
)
 
logging.debug('デバッグレベル')
logging.info('INFOレベル')
logging.warning('警告レベル')
logging.error('エラーレベル')
logging.critical('重大なエラー')
 
 
〇datetimeモジュール
※日付の処理
 
from datetime import datetime,date
datetime.now() #現在時刻
 
datetime.datetime(2025, 3, 26, 10, 1, 21, 140552)
 
date.today() #本日の日付
 
datetime.date(2025, 3, 26)
 
date.today()-date(2001,1,1) #21世紀になってから本日までの日付
 
datetime.timedelta(days=8850)
 
#ISC8601形式の文字列を取得
datetime.now().isoformat()
 
'2025-03-26T10:20:23.125858'
 
#日付を文字列に変換
date.today().strftime('%Y年%m月%d日')
 
'2025年03月26日'
 
#文字列を日時に変換
datetime.strptime('2025年3月26日','%Y年%m月%d日')
 
datetime.datetime(2025, 3, 26, 0, 0)
 
〇pickleモジュール
Pythonのオブジェクトを直列化(serialization)して、ファイルで読み書きできるようにする。
 
〇pathlibモジュール
Pythonでファイルのパスを扱う
 
2-3 JupterLab
 
※IPythonをWebブラウザ上で実行するツール
 Julia、R言語などにも対応
 Notebookにプログラム、ドキュメント(Markdown記法)をまとめられる。
 pandasのDataFrame、Matplotlibなども表示できる。
 
〇便利な使い方
・マジックコマンド(%, %%)
 %timeit :一行のプログラムに対して処理時間を計測する
 %%timeit :セル全体の処理時間を計測する
 
〇OSのシェルコマンドの実行(!)
 
#Pythonパッケージの一覧取得
!pip list
 
〇保存
・File->Download as :HTML,Markdownなどの各種形式で保存(ダウンロード)出来る
 pandocm,LaTeXがインストールされていれば、PDF形式も可能
 
〇実行、参照
・NotebookファイルはJSON形式で記述
 →Jupyter Notebookを実行
 →GitHubではJupyter Notebook環境がなくても参照可能
 
3.数学の基礎
  1 数式を読むための基礎知識
 
〇集合
Pythonの集合型(set型)
x∈S:要素xが集合Sに含まれる
A∩B:集合AとBの共通部分(積集合)
A∪B:集合AとBをまとめたもの(和集合)
Φ 空集合:空っぽの集合
 
〇数のまとまり
x,....,x
x(i = 1,...,n)
 
〇数学記号
Σ:すべてを足す
Π:すべてを掛け合わせる
 
〇定数
π:円周率(3.1415...)
e :ネイピア数自然対数の底 ※e=2.71828...
n! :階乗(nから1まで順に掛け合わせた数)※0=1
 
〇指数関数
 x^n:xをn回掛け合わせる。(xを”底”と呼ぶ)
 
 e^-x:ネイピア数の-x乗
 xが大きくなる→1に近づく
 x=0で0.5
 xが小さくなる→0に近づく
 
〇対数関数
 f(x)=log2x:2を何乗するとxになるか(2を”底”とする場合)
 f(x)=logex=Inx:底がネイピア数のときを”自然対数”と呼ぶ
 ※xが正の領域だけ
 ※f(1)=0
 
 sinθ
  cosθ
  tanθ
 
 ※tanθ=sinθ/cosθ
 
 sinhx=(e^x-e^-x)/2:ハイボリックサイン
  coshx=(e^x+e^-x)/2:ハイボリックコサイン
※懸垂線・カテナリー曲線
  tanhx=sinhx/coshx
 
3-2-1 ベクトルとその演算
〇ベクトル
・向きと長さを持った矢印
※横ベクトル:位置を表す座標
※縦ベクトル;向きと大きさを持つ位置ベクトル
 
・ベクトルの演算
※要素同士の加算減算→要素数が同じでなければ計算できない
 
スカラー:単なる一つの数
※ベクトルとスカラーは掛け算できる。
※それぞれの要素をスカラー倍する
 
・ノルム
 ベクトルの大きさをスカラーで表現
ユークリッド距離:二点間の直線距離 ||x||=|x1|+|x2|+…+|xn|
‐マンハッタン距離:座標軸に沿って移動させた距離
 
内積(ドット積:dot関数、@演算子
 要素同士の数字の掛け算をすべて足し合わせた数
 
3-2-2 行列とその計算
〇行列(matrix)
※行方向と列方向に数を並べる
 
・正法行列:行と列のサイズが同じ
単位行列:左上から右下への対角線上がすべて1、残りが0
・転置:行と列を入れ替える(T)
 
〇行列の演算
・加算減算:対象となる行列の、行数・列数が同じであること!
 各要素を加減する
・ベクトルも行列
 
〇行列の剰余算
・(m行s列) X (s行n列) = m行n列
※順番を入れ替えると結果が変わることに注意!
 
〇行列の分解
・mXn=(mXs)(sXn)
 
※データ分析や機械学習において意味がある
※次元削減
 
  3 基礎解析
 
3-3-1 微分積分
 
積分は面積、微分は傾き
 
・関数F(x)を微分→f(x)
 F:fの原始関数
 f:Fの導関数
 
〇特別な関数の微分積分
・f(x)=e^x:微分しても同じ。積分しても同じだが、積分定数(C)が付く
・(sinx)' = cosx
・(cosx)' = -sinx
・(logx)' = 1/x
・∫(1/x)dx = log|x|+C ※絶対値| |が必要
 
3-3-4 偏微分
※二つ以上の変数を持つ多変数関数の微分
※1つの変数のみに関して微分を行う
 
  3-4 確率と統計
 
〇代表値:データの全体像が把握できる値
・最小値(minimum)
・最大値(maximum)
・平均値(mean):算術平均
・中央値(median):データを小さい順に並べて真ん中に来る数値。ない場合は前後の平均を取る
・最頻値(mode):最も頻繁に出現する値
・分位数:パーセンタイル。四分位数(1/4番ずつ区切る)がよく使われる
 
〇ばらつき
・分散
 各データの平均値からのずれを2乗して、データの個数で割る
 
 分散正の平方根
 
〇度数分布表
 データの最大値と最小値の間を等間隔に区切る→階級
 
3-4-2 データの可視化方法
 
 度数分布表を棒グラフで表現する
 ※データが特定の階級に集中している場合、対数表示(log表示)が有効
 
・箱ひげ図(box plot)
 ‐箱内の白線 :中央値
 ‐箱の底辺 :第1四分位数
 ‐箱の上辺 :第3四分位数
 ‐上下のひげ :最大値、最小値
※IQR(箱の高さ)の1.5倍以上、上下に離れているデータを「外れ値」とする場合もある。
 
・散布図(scatter plot)
 x軸、y軸上に点で割り当てる
 
 分散:
一種類のデータのばらつきの指標
各データの平均値からのずれを2乗して、データの個数で割る
※必ず正の数
 
 共分散:
二種類のデータのばらつきの指標
それぞれの変数について平均値との差を掛け算する
※正の数になるとは限らない
 
 相関係数;(ピアソンの積率相関係数
共分散を二つの変数の標準偏差(分散の平方根)で割った値
※必ず-1から1の間で変化する
 
〇その他の相関係数
・スピアマンの積率相関係数
※データの順番にだけ注目して計算
 数値データがなくても算出可能
 2つのデータの順位の差を2乗して、すべて足し合わせる
 
3-4-4 確率
 
・確率の基礎
全事象:可能な事象すべて
確率(P):個別の事象/全事象
 
・条件付確率
事象Aが起きた条件下で事象Bが起きる確率
ベイズの定理の基本
 
3-4-5 確率分布
 
・確率分布
確率変数とその確率の分布を表したもの
・期待値
確率変数と確率を掛け合わせてすべてを足したもの。データの平均と同じになる。
 
・分散
データのばらつきと同じ
 
3-4-6 確率と関数
 
確率変数が離散的な場合:確率質量関数
確率変数が連続的な場合;確率密度関数
 
・離散一様分布(確率質量関数)
期待値=(a+b)/2
 
※x=0のところで最も高い値、左右対象の釣り鐘型
-∞≦x≦+∞ 0から離れると急速に値が小さくなる
 
☆観測された値=真の値+正規分布で表現される誤差
 
・確率と情報量
確率が1/2の起こる事象について、それが起こったか同課の情報
→1ビットの情報量
情報エントロピー:情報量の期待値(情報量のと確率を掛け算して合計したもの)

 

ここまで

 

☆内容を勘違いしている部分もあるかと思いますが、ご参考になればと思います。

 

【Unity】「VRoidをUnityで動かす【Mixamo】#7

 


www.youtube.com

 

前回作成したTerrain上で、VRoidベースのキャラクターを動かします。 カメラの制御がまだおぼつきませんが、野原や丘を右に左に駆け巡ります。

 

 

こちらが今回のソースコードです。

AnimationStateController.cs

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnimationStateController : MonoBehaviour
{
    Animator animator;
    int isRunningHash;
    int isRunningRightHash;
    int isRunningLeftHash;
    int isMoveHash;
    int isJumpingHash;

    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
        isRunningHash = Animator.StringToHash("isRunning");
        isRunningRightHash = Animator.StringToHash("isRunningRight");
        isRunningLeftHash = Animator.StringToHash("isRunningLeft");
        isMoveHash = Animator.StringToHash("isMove");
        isJumpingHash = Animator.StringToHash("isJumping"); 
    }

    // Update is called once per frame
    void Update()
    {
        bool isRunning = animator.GetBool(isRunningHash);
        bool isRunningRight = animator.GetBool(isRunningRightHash);
        bool isRunningLeft = animator.GetBool(isRunningLeftHash);
        bool isMove = animator.GetBool(isMoveHash);
        bool isJumping = animator.GetBool(isJumpingHash);
        bool runPressed = Input.GetKey("w");                // 走る
        bool runRightPressed = Input.GetKey("d");                // 走る(右)
        bool runLeftPressed = Input.GetKey("a");                // 走る(左)
        bool jumpPressed = Input.GetKey("space");           // Jumpする

 

        //
        if (isRunning || isRunningRight || isRunningLeft)
        {
            // "isMove"ブール値を"true"に設定(動いている))
            animator.SetBool(isMoveHash, true);            
        } else
        {
            // "isMove"ブール値を"false"に設定(動いてない)
            animator.SetBool(isMoveHash, false);
        }

        // "w"キーが押された場合
        if (runPressed)
        {
            // "isRunning"ブール値を"true"に設定(走る)
            animator.SetBool(isRunningHash, true);
        }

        // "w"キーが押されていない場合
        if (!runPressed)
        {
            // "isRunning"ブール値を"false"に設定(止まる)
            animator.SetBool(isRunningHash, false);
        }

        // "d"キーが押された場合
        if (runRightPressed)
        {
            // "isRunning"ブール値を"true"に設定(走る)
            animator.SetBool(isRunningRightHash, true);
        }

        // "d"キーが押されていない場合
        if (!runRightPressed)
        {
            // "isRunning"ブール値を"false"に設定(止まる)
            animator.SetBool(isRunningRightHash, false);
        }

        // "a"キーが押された場合
        if (runLeftPressed)
        {
            // "isRunning"ブール値を"true"に設定(走る)
            animator.SetBool(isRunningLeftHash, true);
        }

        // "a"キーが押されていない場合
        if (!runLeftPressed)
        {
            // "isRunning"ブール値を"false"に設定(止まる)
            animator.SetBool(isRunningLeftHash, false);
        }

        // プレーヤーがJumpしていない状態、かつ、スペースキーが押された場合
        if (!isJumping && jumpPressed)
        {
            // "isJumping"ブール値を"true"に設定(Jumpする)
            animator.SetBool(isJumpingHash, true);
        }

        // プレーヤーがJumpしている状態、かつ、スペースキーが押されていない場合
        if (isJumping && !jumpPressed)
        {
            // "isJumping"ブール値を"false"に設定(Jumpをやめる)
            animator.SetBool(isJumpingHash, false);
        }
    }
}

 

 

 

【Unity】Terrainで地面を作る


www.youtube.com

 

UnityのTerrainを使って、地面を作ります。
Freeのアセットを使い、少し見栄えをよくしたいと思います。

 

使用ソフトウェア:
Unity Ver.2021.3.15f1

使用アセット:
アセットストア
https://assetstore.unity.com/?locale=ja-JP

AllSky Free - 10 Sky / Skybox Set
https://assetstore.unity.com/packages/2d/textures-materials/sky/allsky-free-10-sky-skybox-set-146014

Nature Starter Kit 2:
https://assetstore.unity.com/packages/3d/environments/nature-starter-kit-2-52977

Realistic Tree 9 [Rainbow Tree]
https://assetstore.unity.com/packages/3d/vegetation/trees/realistic-tree-9-rainbow-tree-54622

Terrain Toolkit Re:
https://assetstore.unity.com/packages/tools/terrain/terrain-toolkit-re-192689

 

ご注意:
Unityはバージョンが変わると使い方が大きく変わる場合があります。
他バージョンではこの動画と動作が異なる場合があります。
アセットに関しても同様です。

 

Unityには「Terrain」という地面を作る機能があります。

 

今回はアセットを使って少し見栄えのいいものにしたいと思います。

アセットストアから上記のアセットをインポートしておいてください。

 

 

ヒエラルキーに「3Dオブジェクト」→「Terrain(地形)」で、Terrainを作ります。

 

 

 

原点が端になっています。

わかりにくいので位置と大きさを変えたいと思います。

設定のアイコンが小さくてわかりにくいんですが、一番右側の歯車が付いているものをの開きます

 

メッシュ解像度、ここで縦、横、高さを設定します。

大きすぎるので、50050060に設定しました。

 

 

さらに位置を調整しました。

X:-250Z:-250にして、原点を中央部持ってきます。

 

 

コンポーネントを追加」をクリックして、「Terrain tool Kit 」(C#)を追加します。

 

 

追加するとすると下にGUIが追加されます。

そしてこれを使うとある程度、自動的に地面をデザインすることができます。

 

 

※今回、具体的に何をどう設定したのかは、動画をご覧ください。

 かなりグダグダですが…。

 

樹木は2種類使いました。

真ん中のアイコンが、樹木をペイントするツールです。

 

 

次にスカイボックスを設定します。

これライトライティングの設定になるのですが、すごくわかりにくいところにあります。

 

 

環境のタブにスカイボックスのマテリアルを選ぶ場所があります。

 

 

インポートしたマテリアルを選びます。

 

 

ゲームの画面にするとこんな風に見えます。

 

 

以上、簡単に説明しました。

詳しくは動画をご覧ください。

 

ではでは。

 

 

【Unity】「VRoidをUnityで動かす」#6(Terrainとスカイボックス)【Mixamo】

youtu.be

今回は、Terrainとスカイボックスの設定を、Unityのプロジェクト上で行っていきます。

 

私もまだ勉強を始めたばかりなので、勘違いや間違いがあるかもしれませんが、ご容赦ください。

 

Terrain Toolkit Re:
URL:https://assetstore.unity.com/packages/tools/terrain/terrain-toolkit-re-192689

AllSky Free - 10 Sky / Skybox Set:
URL:https://assetstore.unity.com/packages/2d/textures-materials/sky/allsky-free-10-sky-skybox-set-146014

 

【Unity】「VRoidをUnityで動かす」#5(プログラムと状態遷移の連携)【Mixamo】

youtu.be

今回は、VRoideのキャラクターにMixamoで適用したアニメーションとキャラクタを操作するためのプログラムとの連携を、Unityのプロジェクト上で行っていきます。

☆この動画を作るにあたって、「iHeartGameDev」チャネル様を参考にさせていただいております。
素敵な動画をありがとうございます。
URL:https://www.youtube.com/c/iHeartGameDev

私もまだ勉強を始めたばかりなので、勘違いや間違いがあるかもしれませんが、ご容赦ください。

 

【Unity】「VRoidをUnityで動かす」#4(アニメーションの適用)【Mixamo】


www.youtube.com

今回はVRoideのキャラクターにMixamoで適用したアニメーションを、Unityのプロジェクト上に展開していきます。
なお、この動画内の説明、前半は少し間違っています。
間違いやすいところなので、そこはわざと残し、15分ごろから、訂正と説明を行っています。
ご注意ください。

☆この動画を作るにあたって、「iHeartGameDev」チャネル様を参考にさせていただいております。
素敵な動画をありがとうございます。
URL:https://www.youtube.com/c/iHeartGameDev


私もまだ勉強を始めたばかりなので、勘違いや間違いがあるかもしれませんが、ご容赦ください。

 

ソースコード(これだけです):

AnimationStateController.cs

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnimationStateController : MonoBehaviour
{
    Animator animator;
    int isRunningHash;
    int isFastRunningHash;
    int isJumpingHash;

    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
        isRunningHash = Animator.StringToHash("isRunning");
        isFastRunningHash = Animator.StringToHash("isFastRunning");
        isJumpingHash = Animator.StringToHash("isJumping"); 
    }

    // Update is called once per frame
    void Update()
    {
        bool isRunning = animator.GetBool(isRunningHash);
        bool isFastRunning = animator.GetBool(isFastRunningHash);
        bool isJumping = animator.GetBool(isJumpingHash);
        bool runPressed = Input.GetKey("w");                // 走る
        bool fastRunPressed = Input.GetKey("left shift");   // 早く走る
        bool jumpPressed = Input.GetKey("space");           // Jumpする

        // プレイヤーが走っていない状態、かつ、"w"キーが押された場合
        if (!isRunning && runPressed)
        {
            // "isRunning"ブール値を"true"に設定(走る)
            animator.SetBool(isRunningHash, true);
        }

        // プレイヤーが走っている状態、かつ、"w"キーが押されていない場合
        if (isRunning && !runPressed)
        {
            // "isRunning"ブール値を"false"に設定(止まる)
            animator.SetBool(isRunningHash, false);
        }

        // プレーヤーが速く走っていない状態、かつ、"w"キーと"左Shift"キー両方を押した場合
        if (!isFastRunning && (runPressed && fastRunPressed))
        {
            // "isFastRunning"ブール値を"true"に設定(早く走る)
            animator.SetBool(isFastRunningHash, true);
        }

        // プレーヤーが速く走っていない状態、かつ、"w"キー、または、"左Shift"キー、どちらかが"押されていない"場合
        if (isFastRunning && (!runPressed || !fastRunPressed))
        {
            // "isFastRunning"ブール値を"false"に設定(早く走るのをやめる。走るか、止まるかは押されているキー次第)
            animator.SetBool(isFastRunningHash, false);
        }

        // プレーヤーがJumpしていない状態、かつ、スペースキーが押された場合
        if (!isJumping && jumpPressed)
        {
            // "isRunning"ブール値を"true"に設定(Jumpする)
            animator.SetBool(isJumpingHash, true);
        }

        // プレーヤーがJumpしている状態、かつ、スペースキーが押されていない場合
        if (isJumping && !jumpPressed)
        {
            // "isRunning"ブール値を"false"に設定(Jumpをやめる)
            animator.SetBool(isJumpingHash, false);
        }
        
    }
}