chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

Meta Quest2を使った印象

今日Meta Quest2を入手したので感想をメモ

  • 初めて装着した感じは一人で映画館にいるような感じ、流れてくるサウンドも良くて没入感は強い
  • オプションを付けていないのでバランスが悪く、頭の前面が重い(首が凝る)
  • 自分は目が悪くて普段は眼鏡で、裸眼ではよく見えない。無理して眼鏡を付けたまま装着するとこめかみが痛い。
  • アプリやコンテンツはあまりなさそうな感じ(You Tubeで3D対応コンテンツもあまりないような)
  • フリー版のBeat Saberをやってみた。これは面白い、VRをどう楽しめるのかがストレートに伝わってきて分かりやすい。空間を移動できたらもっといいのにと思った。
  • 総じて、機械も重くて大げさなので、一般に普及するにはもっと軽量コンパクトで気軽に装着できるようにならないといかんのではと思った。自分はオタクな方なので別にこれでもいいですが。。

VRの質を高めるには映像に加え、音もこだわる必要があると思った。質の良いリアリティのある音。閉鎖感から、VRでのRAVEパーティなんかも盛りあがるかも。。

■追記
主に使ってるのはVRChatとGame(beat saber)なのだが、VR Chatで歩き回ると酔ってしまう。移動のしかたが、早すぎたり横スクロールするのがまずいと思われる。人体だと物理的にありえない動き方の絵を見てしまうから、頭がついていけないのだろう。だから、、細かく動くか、大きく動く時は目をつむるかしないと、酔った感じになってしまう。
使い始めは目の前に異空間が広がっていると感心したけど、段々と慣れてくると視野角が比較的狭くて、双眼鏡で見ているような感じが気になってきた。目の前の事に集中すると、視野角は忘れてしまいますが。

UE5 tutorial. カウントダウンして爆発

引き続き、Tutorialをやってみる。カウントダウンして爆発効果になるやつ。

掲示されているサンプルを打ち込んでコンパイルするとエラーになった。自分のやった修正方法が正しいのかわからないが、エラー回避できるように少し修正
file:Countdown.h

#pragma once

//#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Runtime/Engine/Classes/Components/TextRenderComponent.h"
#include "Countdown.generated.h"

UCLASS()
class TEST_CPP3_API ACountdown : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ACountdown();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	UPROPERTY(EditAnywhere)
	int32 CountdownTime;

	UTextRenderComponent* CountdownText;

	void UpdateTimerDisplay();
	void AdvanceTimer();

	UFUNCTION(BlueprintNativeEvent)
	void CountdownHasFinished();
	virtual void CountdownHasFinished_Implementation();

	FTimerHandle CountdownTimerHandle;
};

file:Countdown.cpp

#include "Components/TextRenderComponent.h"
#include "Countdown.h"

// Sets default values
ACountdown::ACountdown()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = false;
	CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));
	CountdownText->SetHorizontalAlignment(EHTA_Center);
	CountdownText->SetWorldSize(150.f);
	RootComponent = CountdownText;

	CountdownTime = 3;

}

// Called when the game starts or when spawned
void ACountdown::BeginPlay()
{
	Super::BeginPlay();

	UpdateTimerDisplay();
	GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountdown::AdvanceTimer, 1.0f, true);
	
}

// Called every frame
void ACountdown::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

void ACountdown::UpdateTimerDisplay()
{
  //  CountdownText->SetText(FString::FromInt(FMath::Max(CountdownTime, 0)));
  CountdownText->SetText(FText::FromString(FString::FromInt(FMath::Max(CountdownTime, 0))));
}

void ACountdown::AdvanceTimer()
{
  --CountdownTime;
  UpdateTimerDisplay();
  if (CountdownTime < 1)
    {
      GetWorldTimerManager().ClearTimer(CountdownTimerHandle);
      CountdownHasFinished();
    }
}
void ACountdown::CountdownHasFinished_Implementation()
{
  //CountdownText->SetText(TEXT("GO!!"));
  CountdownText->SetText(FText::FromString("GO!!"));
}

memo:
UFUNCTION(BlueprintNativeEvent)と宣言することで、BlueprintからCountdownHasFinishedを呼び出すことが可能になっている。

サンプルを見ずにC++でコーディングできる日が来るのかどうかは分からないけど、プログラミングすることでパーツの動きを制御できるのは面白くてワクワクする。

docs.unrealengine.com

Unreal Engine5のC++ Tutorialをやってみる

Unreal Engineの動きの定義は使いやすいBluePrintが主流と思われるが、C++で実装したいので、tutorialをやってみた。tutorialのままなのだが、作った画面は以下

実際の画面では、机の上のキューブが上下に動きながら、回転します。
ソースコードは以下
file: FloatingActor.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FloatingActor.generated.h"

UCLASS()
class TEST_CS02_API AFloatingActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AFloatingActor();
    UPROPERTY(VisibleAnywhere)
    UStaticMeshComponent* VisualMesh;

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

file: FloatingActor.cpp

#include "FloatingActor.h"

// Sets default values
AFloatingActor::AFloatingActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

    
    VisualMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
    VisualMesh -> SetupAttachment(RootComponent);
    
    static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube"));
    if(CubeVisualAsset.Succeeded())
    {
        VisualMesh->SetStaticMesh(CubeVisualAsset.Object);
        VisualMesh->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
    }
}

// Called when the game starts or when spawned
void AFloatingActor::BeginPlay()
{
	Super::BeginPlay();
}

// Called every frame
void AFloatingActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

    FVector NewLocation = GetActorLocation();
    FRotator NewRotation = GetActorRotation();
    float RunningTime = GetGameTimeSinceCreation();
    float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
    
    NewLocation.Z += DeltaHeight* 40.0f;
    float DeltaRotation = DeltaTime * 80.0f;
    NewRotation.Yaw += DeltaRotation;
    SetActorLocationAndRotation(NewLocation, NewRotation);
}

■ご参考URL
docs.unrealengine.com

■今後の課題
Cubeを次々に発生させたい。そして後方に飛んでいかせたい。アクタを生成するのはSpawnActor関数らしい。これをタイマを使って連続的に発生させると、Cubeが生成されて流れていくように作れるはずなのだが

C++からSPAWNさせる方法(どこに書いたらいいのやら)

FString path = "/Game/SomeActor.SomeActor_C";
TSubclassOf<class AActor> ClassObject = TSoftClassPtr<AActor>(FSoftObjectPath(*PathName)).LoadSynchronous(); 
if (ClassObject  != nullptr)
{
    ASomeActor* actor = (ASomeActor*)GetWorld()->SpawnActor<AActor>(ClassObject);
}

[https://papersloth.hatenablog.com/entry/2018/09/24/155634:title]

引用:
Unreal C++/Blueprint 雑多なメモ (Unreal Engine 4.26.1) - Qiita

memo Unreal Engine 5

Unreal Engine 5 Beginner Tutorial - UE5 Starter Course! - YouTube
Unreal Engine 5 Beginner Tutorial: Getting Started - YouTube
UnrealEngine5の教科書 [入門編,第一巻]
https://www.youtube.com/watch?v=7DgXhOTV1AE
UE4 の C++ プログラミング入門 | Unreal Engine ドキュメント
Unreal Engine 5から始める C++ & Blueprint
Learn Unreal Engine (with C++) - Full Course for Beginners - YouTube
Programming with C++ in Unreal Engine | Unreal Engine 5.0 Documentation
Unreal Engine C++ 逆引きメモ - e.blog

UE5を使ってVRでやりたいこと

  • 自分で景色を作る(森林の風景)
  • meta quest等のVRゴーグルで景色に入る
  • まったりする
  • バーチャル嫁を作る(リアル嫁はつれないので)
  • バーチャル嫁とまったりする
  • バーチャルなお茶室を作る(待庵)
  • お茶室でお茶会をやる

わかってきたこと

Unreal Engineを学ぶ方法

  • 情報も多いので、とりあえず簡単なゲームを一本作るのが早いかと

Unityを勉強する

VRChatをやってみたいと思っていて、VRChatで自分のアバターを作るにはUnityらしかった。そんなわけでUnityを勉強してみる。Unityは2D/3D用のアプリ開発ツールと思ってますが、オブジェクト?を動かすのはC#で定義するらしい。一冊本を買ってみた。YouTubeでも解説動画が出ているので、ピンボールのようなアプリを作ってみた。下の画面はUnityを使ってピンボール風のボードを作っているところ。

ボールの動きは以下のC#で定義、壁にぶつかったら、X,Z方向の速度Vx、Vzを反転させるというだけのプログラム
Updageメソッドが画面更新時に全オブジェクトに対して呼び出されるので、ここに動作を規定しておけば、アニメやゲームのような動きになると。

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

public class BallBehaviourScript : MonoBehaviour
{

    private float v_x = 0;
    private float v_y = 0;
    private float v_z = 0;

    AudioSource audioSource;
    AudioClip sound1;


    // Start is called before the first frame update
    void Start()
    {
        v_x = -10;
        v_y = 0;
        v_z = -10;
	// get Component 
	audioSource = GetComponent<AudioSource>();


    }

    // Update is called once per frame
    void Update()
    {
        float delta_x = v_x * Time.deltaTime;
        float delta_z = v_z * Time.deltaTime;
        transform.position += new Vector3(delta_x, 0f, delta_z);
        //Debug.Log(transform.position);
    }
    private void OnCollisionEnter(Collision collision)
    {
	string tagName = collision.gameObject.tag;

        Debug.Log("collision");
        Debug.Log(tagName);

        if (tagName == "Paddle" || tagName == "Wall_Z")
        {
            Debug.Log("target is paddle or wall");
            v_z *= -1;
	    audioSource.Play();
        }
        if (tagName == "Wall_X")
        {
            v_x *= -1;
	    audioSource.Play();
        }
    }
}

ボールが壁にぶつかると跳ね返りますが、その際に音もなるようにしています(audioSource.Playを利用)。
とりあえずみんなが最初に作るアプリと思われ、珍しいものではありませんが、一応動いている画面は以下
youtu.be

■追記(2022/06/09)
Unreal Engineの方がレンダリングがきれいなので、UnityからUnreal Engineに変更する。推奨PCはWIndows+GPU(グラボ)なのだが、自分の環境はMac Book Proだ。GPUとかはそれほどなので、、パワー不足になりそうだ。

■関連情報
C#の観点からUnityを学ぶ本
本の半分ぐらいはC#の文法を解説しています。後半がC#でUnityのオブジェクトを動かす説明。

動画付きで分かりやすいドットインストールのUnity解説(無料です)
dotinstall.com

https://learn.unity.com/course/unity-tutorials-for-beginners-jp?language=ja

GWももう終わり、、このGWはひたすら原稿と苦闘、漫画に逃避

今日は5/7で明日で連休も終わり。休みをいただけるのはもちろんありがたい事。だが、、自分のへなちょこ根性のせいもあって、ひたすら原稿書き*1に苦闘し続けた。大半の時間が逃避で漫画を読みまくっていた。 読んだのは
笠辺哲氏のコミックで、フライングガール*2とか、ももきやとか。。フライングガール、ももきやはSFベースですが、ストーリーに出てくる男女の関係もほんわかHに表現されています。エラそうに自分がコメント書くのもなんですが、、短編集なんか、つげ義春のような無常感というか、どうにもならない虚な感じが表現されています。だから、、この作家の作品は好きです。好きですが、、あまりにマイナーな作家なのか、コメント数も非常に少ないです*3。以下の3つは2005年〜2009年の作品らしいです(今から17年前か。。)。

ももきや 1巻

ももきや 1巻

Amazon

■追記
結局原稿は連休最終日(5/8)の18時に書き終わった。18時からは夕食なので。。潜在意識下で逆算していたとしか思えない。。

*1:Interface誌に連載している、逆引きMicroPython、8月号で連載終了

*2:ヒロインの着てるTシャツのデザインがいきなり”バスト88”という

*3:Amazonでも作者名が不統一のため別人になっている。"笠辺哲"vs"笠辺 哲"