20200315のUnityに関する記事は5件です。

Unity入門:今週悩んだことと。単純なバグに長時間時間を取られてしまった。

はじめに

今週勉強したことをまとめています。
初めまして、HITOMI(男)です。現在Unityを勉強しています。今週勉強したこと、悩んだことをここに書き残します。

先週悩んでいた、UIのアニメーションをうまく実装することができました。うまくいかなかった原因は私の操作ミスだと考えています。できるだけこういったミスを少なくしていきたいなと考えています。

さて、私はUnityの勉強のため3D横スクロールゲームを開発しています。そこで今週悩んだことや、詰まったとこをここに書き残そうと思います。
今週(3月8〜3/14日)詰まったところ。
・読み込みクラスの単純なバグの解決に1日以上ほどかかった。
・GUIのアニメーション遷移でのバグ。
・イベント読み込みクラスについて

単純なバグの解決に1日以上かかった。

データ読み込みクラス(前回紹介したの部分)でうまく読み込めないバグが発生しました。結論から言うとバグは解決したのだが、バグの場所の特的と修正に1日以上時間かかってしまった。そのバグの原因はfor文の Length-1の −1をつけ忘れていたと言う単純なミスでした。こんな単純なミスで時間を取られた時は、「うわーーーーーー」ってなります。今後こんな単純なミスはできるだけ無くしていきたいと思います。何か対策を取らなくては。

//ここが抜けていた。
for(var i; I<m_List.Count -1; i++)
{

} 

GUIのアニメーション遷移でバグが発生した。

漫画などによく使われている、吹き出しのアニメーションをプログラムで実装しています。内容は吹き出しがフェードインしたとに、テキストが一定間隔で表示され、テキストが終了するとフェードアウトする。といったものです。今回発生したバグは2周目のフェードインの時にフェードインが終わった際に吹き出しが消えるといったものだ。Unity上で再生を一時中断してCanvasを確認したところ、ImageのRectTransformのscaleが0,0,0になっていた。アニメーション部分がうまく動いていることを考えると、コルーチンとsetActiveの部分に問題がある思っている。実際setActiveを常にtrueにすると問題なく動く。色々悩んだ末、画面から非表示にする処理をsetActiveを使わずにscale0を用いることにした。こうするとうまく動くことができた。この部分はまた、全体が完成してからもりもり作り込んでいこうと考えている。

イベント読み込みクラスに改良

外部のテキストから以下のようなファイルを読み込み
イベント等を実装するクラスを作っています。
(ゲームプログラマになる前に覚えておきたい技術参考)

<EventData name=“event01”,type = “count”,trigger=“”,nextEvent=“event02”>
        <CountDown position = "hairScreen,hairScreen,0.0f">
</EventData>

<EventData name=“event02”,type = “speak”,trigger=“”,nextEvent=“event03”>
        <TriggerObject type = “box” , event=“event”, position = "12.4,7.0,0.0”, size="1.0,1.0,1.0"></TriggerBox>
        //行動制限
        <SpeechBubble position="12.4,7.0,0.0">
                    <Speech speech="左右の矢印を押すと移動できるよ” , type=“timer”></Speak>
                    <Speech speech="上ボタンを押すとジャンプできるよ” , type=“wait”></Speak>
                    <Speech speech="下ボタンを押しても何もないよ。” , type=“wait”></Speak>
        </SpeechBubble>
</Event>
<EventData name=“event03”,type = “clear”,trigger=“”,nextEvent=“none”>
      略
</Event>

前回考えていたテキストの内容をプログラムに反映しました。その結果、カウントダウンからスタートクリアまで外部テキストで調節できるようになりました。と言っても、実際はカウントダウンとクリアは一枚絵を貼り付けただけで実際にアニメーションまでは実装できていません。来週はこれにカメラの制御とプレイヤーの動きを制御できるよう機能を追加したいと考えています。

さいごに

今週は思っていたよりも進捗が遅れています。多分3月中の完成はちょっと難しいのかなと考えています。来週はスタートからクリアまで一通り遊べるようにすることと、メモリリークをなくすところまで進めたいと考えています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【中級者向けUnity講座】RPG編 part4『キャラにカメラを追従させる』

はじめに

皆様こんにちは。個人でゲーム制作をしております、kenと申します。
この講座では、実際にゲームを作りながら「こういう事をするなら、こういう風にすると良いと思うよ。詳しくは自分で調べてね。」という感じで、ゲームの作り方、Unityの機能やアセット等を軽く紹介して行きます。

今回は、カメラをオブジェクトに追従させる方法をいくつか紹介します。

StandardAssetsを使う

多分これが1番簡単だと思います。
StandardAssetsに簡単なカメラのスクリプトがあるので、アセットストアからStandardAssetsをインポートして、それを使いましょう。

使い方は調べなくても見れば分かるくらい簡単ですが、一応使い方を解説している記事を貼っておきます。
Unityでカメラの設定とキャラクターの追従をさせる

Cinemachineを使う

Cinemachineを使うと高機能なカメラがノンコーディングで作れちゃいます。めちゃくちゃ多機能で、3Dも2Dもあらゆるタイプのカメラが作れます。

どんな事ができるの?

まずは、どんな事が出来るのか、公式のサンプルの中からゲームでよく使いそうなものを紹介します。

ちなみに、このサンプルで使われているキャラ移動のスクリプトですが、キー入力の判定がFixedUpdate内に書かれているので、ジャンプキーの反応が悪いです。part2でも言いましたが、キーの入力判定をFixedUpdate内に書かないようにしましょう。

2DConfiner

2Dでキャラをスムーズに追従しつつ、壁の向こう側を移さないようにするカメラです。
01af8644-f179-4c93-8d38-cb04a28653c6.gif

2DTargetGroup

2Dで複数の対象がカメラに収まるようにズームするカメラです。
3f58071b-d488-45d0-8065-64bd547cc7ed.gif

Free Look character

よくある3Dの三人称カメラです。
95c131bb-f648-40da-afe3-6814dc313e2a.gif

Free Look collider

壁を貫通しない3D三人称カメラです。
36f8ffd2-d052-4871-9627-7eb5f98f3149.gif

Noise

ランダムで揺れるカメラです。
1d7e34b9-3345-4c37-9bc9-b387b3212107.gif

StateDrivenCamera

走っている間だけカメラをゆれるカメラに切り替えるサンプルです。もう少し詳しく説明すると、Cinemachineには仮想カメラというものを複数用意し、それらをスムーズに切り替えられる機能があるので、キャラクターの状態ごとに別のカメラに切り替えるサンプルですね。三人称視点と一人称視点の切り替えなんかにも応用できそうです。
7371a813-2a37-4f15-b870-dff4a939fda6.gif

他にもいろんなことが出来ますし、カメラの挙動はかなり細かく設定することが出来ます。

使い方

Cinemachineの基本的な使い方は以下の記事が分かりやすいです。
【Unity】Cinemachine入門!スクリプトなしでカッコいいカメラワークを作る

サンプルの種類がめちゃくちゃ豊富なので、Cinemachineを詳しく知りたい方は、自分でサンプルをインポートして動かしてみるのがオススメです。

オブジェクトを動かしてみよう!

『実際にゲームを作りながら紹介していく』と言いながら、いまだに何も作ってませんでしたが、そろそろ動くものを作りたいと思います。

今まで紹介して来た機能の中から以下の機能を使ってカプセルを動かしてみます。
・移動/NavMesh
・入力の取得/新しいInputSystem
・カメラ/Cinemachine

NavMeshの設定

まずは、適当に作ったTerrainにNavMeshをBake
image.png
適当にカプセルを置いてNavMeshAgentをアタッチ(設定はデフォルトのまま)
image.png

InputSystemの設定

InputSystemのサンプルに付いているSimpleControlsをそのまま使います。
image.png

Cinemachineの設定

仮想カメラを作成。
image.png
メインのカメラにCinemachineBrainをアタッチします。Priorityの高い仮想カメラが自動で選択されるので、特に何も設定しなくても使えます。
image.png

スクリプト

移動する方向を受け取って移動させるクラスと、入力の方向とカメラの向きから移動する方向を算出して移動させるクラスに渡すクラスに分離しました。これをカプセルにアタッチします。

IMoveComponent.cs
using UnityEngine;

public interface IMoveComponent {

    void Move(Vector3 velocity);

}
MoveAgent.cs
using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]

public class MoveAgent : MonoBehaviour, IMoveComponent {

    [SerializeField] float _speed = 3f;
    NavMeshAgent _agent;

    void Start() {
        _agent = GetComponent<NavMeshAgent>();
    }

    public void Move(Vector3 velocity) {
        _agent.Move(velocity * _speed);
    }

}
PlayerController.cs
using UnityEngine;

[RequireComponent(typeof(IMoveComponent))]

public class PlayerController : MonoBehaviour {

    Camera _mainCamera;
    SimpleControls _controls;
    IMoveComponent _moveComponent;

    void Awake() {
        _controls = new SimpleControls();
    }
    void Start() {
        _mainCamera = Camera.main;
        _moveComponent = GetComponent<IMoveComponent>();
    }

    void OnEnable() {
        _controls.Enable();
    }
    void OnDisable() {
        _controls.Disable();
    }
    void OnDestroy() {
        _controls.Dispose();
    }

    void Update() {
        var inputVector = _controls.gameplay.move.ReadValue<Vector2>();
        var cameraVector = _mainCamera.transform.forward;
        var velocity =Quaternion.LookRotation(cameraVector, Vector3.up)* new Vector3(inputVector.x, 0, inputVector.y);
        velocity *= Time.deltaTime;
        _moveComponent.Move(velocity);
    }
}

完成品

動いた!
0a1e11e5-fb65-405c-831e-5a048693971b.gif

まとめ

やっとオブジェクトを動かせるようになりましたが、カプセルを動かしても面白く無いですね。

という訳で次回は、キャラクターのセットアップの仕方を紹介します。
次回⇨4/5(日)投稿予定(他に書きたい記事があるので2週間お休みします)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】Raycastで簡単に弾道に沿った当たり判定を実装する方法

はじめに

銃を扱うゲームにおいて当たり判定の実装は不可欠ですが、リアルな弾速で弾を飛ばすと簡単にすり抜けてしまいます。
銃口からRayを飛ばせば弾速は出せますが、リアルさを求めているのに弾道が直線というのも残念ですよね。
今回はRaycastの速さと、リアルな弾道の放物線を両立する方法を紹介したいと思います。
(Unity歴が浅いので、もしかしたらポピュラーな方法かもしれません。また、もっと簡単でいい方法(CollisionDetectionModeとか)があるのかもですがご容赦ください。)

方法

考え方は至って単純で、弾の前フレームでの位置から今のフレームでの位置にRaycastを飛ばして当たりを判定します。

コード

Vector3 prepos;

void Start(){
    prepos = transform.position; //前フレームでの位置
}
void Update(){
    Vector3 pos = transform.position; //今フレームでの位置
    Ray ray = new Ray(prepos, (pos - prepos).normalized); //前フレームの位置から今の位置の向きにRayを飛ばす
    RaycastHit hit; //これがあると当たったオブジェクトの情報が扱える
    if (Physics.Raycast(ray, out hit, (pos - prepos).magnitude, 1 << 8)){ //判定ししたいオブジェクトはレイヤーを分けておく(この場合はレイヤー8)
        Debug.Log("Hit!"); //当たったらコンソールにて報告
    }
    prepos = pos; //今のフレームの位置を次のフレームにおける前のフレームの位置として保存
}

注意

この方法ではRay(すごくほそい)を使っているため、オブジェクトのpositionの座標が通過しないと当たりが検出されません。
そのため弾丸など小さな物体には有効ですが、大きさのあるものに使うのはおすすめしません。

まとめ

需要があるかわからない当たり判定の紹介でした。問題等あれば教えて下さい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity2018.4はLTSだけどバージョンアップで破壊的変更されている

修正以外の変更内容

Unity2018.4.1以降に修正以外で変更された内容を抜き出しました。
LTSなのにBackwards Compatibility Breaking Changesなんて項目もありますね。

  1. https://unity3d.com/unity/whats-new/2018.4.4

    Changes
    - Android: Android Gradle plugin version updated up to 3.4.
    - Android: Gradle version updated up to 5.1.1.

  2. https://unity3d.com/unity/whats-new/2018.4.5

    Improvements
    - Version Control: Added "Overwrite Failed Checkout Assets" editor setting, turning it off makes unity not overwrite files that can't be checked out. (1010999, 1158593)

  3. https://unity3d.com/unity/whats-new/2018.4.6

    Backwards Compatibility Breaking Changes
    - Apple TV: Remove support for Universal Harmony Remote, supporting this controller made Siri Remote and gamepads regrees by producing unintended double events for button clicks. For more information check UnityView+Keyboard.mm pressesBegan/pressesEnd functions.

    Improvements
    - XR: Updated Vuforia to version 8.3.8.

  4. https://unity3d.com/unity/whats-new/2018.4.10

    Backwards Compatibility Breaking Changes
    - Android: Improve error messages for cases where android application fails to load libmain.so. Previously it was printing "Unable to find main", now it will print "Failed to load 'libmain.so', the application will terminate.", additionally it will print exception from System.loadLibrary with detailed info, where the application was looking for libmain.so

    Improvements
    - Graphics: Optimised Cluster Rendering networking.

  5. https://unity3d.com/unity/whats-new/2018.4.14

    Changes
    - XR: Updated to Oculus 1.38 plugin and added support for valid tracking poses even when devices aren't fully tracked. (1197386)

  6. https://unity3d.com/unity/beta/2018.4.16f1

    Changes
    - Package Manager: Changed the package installation process to no longer set package directories and files as read-only on disk. This prevents all sorts of possible corruption scenarios (e.g. read-only directories, partially-read-only packages in the package cache) and avoids some permission issues when removing packages.
    - Package Manager: Changed the package installation process to systematically revert packages to their original state. Note: this has the side-effect of actively reverting local modifications in immutable packages, which could previously be kept until the dependency was updated to a different version of the package. In order to preserve local changes, a package should first be embedded in the project.

    Improvements
    - Package Manager: Added support for configuring additional SSL certificate authorities, including self-signed certificates. See the Unity Manual for more information on how to use this.
    - Package Manager: Added support for Git URLs with the SCP format (e.g. git@github.com/user/repo).
    - Package Manager: Added support for Git URLs without a trailing .git by using git:// URLs or prepending git+ to URLs (e.g. git+https://github.com/user/repo).
    - Package Manager: Added support for tarball-based dependencies (e.g. "file:.tgz").
    - Package Manager: Changed the UnityEditor.PackageManager.Client.Add method to make the @ prefix optional when adding Git-based dependencies and local dependencies (file:).
    - Package Manager: Reduced the amount of data transferred over the network when fetching package metadata from the registry.

    Features
    - Multiplayer: Added UNET encryption support.

  7. https://unity3d.com/unity/beta/2018.4.19f1

    API Changes
    - Particles: Added: Added NativeArray overloads to SetParticles and GetParticles

    Improvements
    - Editor: Greatly improves performance over large numbers of objects with RectTransforms, scene navigation is now very smooth. However actual picking is still very slow (no change). (1165982)
    - XR: Updated minimum version of Windows Mixed Reality package.

リリースノートを調べた経緯

Unity2018.4.9f1とOculus Integration v1.37を使ったプロジェクトがあり、Unityのパッチバージョンを上げてみると実機で起動できなくなりました。
公式フォーラムやAnswersでも原因を特定できておらず藁にもすがる思いで各バージョンのリリースノートをたどると2018.4.14fに以下の変更がありプロジェクト内のバージョンより大きくなっていました。

Changes
- XR: Updated to Oculus 1.38 plugin and added support for valid tracking poses even when devices aren't fully tracked. (1197386)

恐らくこれが原因で2018.4.13f1でビルドしたものは起動できて2018.4.14f1でビルドしたものは起動できませんでした。
バージョンアップする時は下位互換性だけではなくライブラリのバージョンなど他の内容も確認が必要そうです。

色々なご意見












  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unity2019 + mac + VisualStudioCodeで、補完が効かなくなった時の対処メモ

環境

  • mac OS 10.15.1
  • Unity2019 2.12f1 (.Net4)
  • Visual Studio Code 1.43.0

Visual Studio Codeを使っていて、補完が効かなくなり、
下記エラーに遭遇、以前に設定した解決したけど、忘れてしまったので自分用に再度メモ。

OmniSharp.MSBuild.ProjectLoader
        The reference assemblies for .NETFramework,Version=v4.7.1 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks

https://aka.ms/msbuild/developerpacks
エラーを参考にこのリンクをたどっていってもmac用のそれらしいファイルが見当たらず、
windows用はあった、またVisualStudioならできるような情報もあったが、VSCodeのみで
完結したかったので参考になったので下記記事!

https://qiita.com/kyasbal_1994/items/ecf19a3feb60a12a61f9
m(_ _)mありがたや

手順メモ

1. まず下記extensionがVSCodeに入っている前提

image.png

2. ターミナルで、monoを入れておく。

$ brew install mono

※状況のおおじて、最新版を入れておくといいかも→ brew upgrade mono

3. VSCodeのユーザー設定ファイルのsetting.jsonに下記monoの設定を記入

コマンドパレット(Cmd+Shift+P)で、「setting json」などで検索

setting.json
{
    〜省略〜
    "omnisharp.useGlobalMono": "always",
    "omnisharp.monoPath": "/usr/local/Cellar/mono/6.8.0.105"
}

/usr/local/Cellar/mono/6.8.0.105は、monoインストール時のパスを入力する

あとは、VSCode再起動で改善した!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む