【UE4】text boxに入力したURLの動画を再生する

こんにちは。今回は、UE4で動画を再生させてみようと思います。

まずは、何でもよいのですがThird PersonのBuluePrintClassをします。

作成したらcontentの中にStream Media Sourceを追加します。

f:id:tyojugiga:20191017223828p:plain

次にMedia Playerを追加します。

f:id:tyojugiga:20191017224141p:plain

追加しようとすると以下のような表示が出るのでチェックします。

f:id:tyojugiga:20191017224415p:plain

するとTextureが生成されるので、そのMaterialを作成します。

f:id:tyojugiga:20191017224544p:plain

次にWidget BluePrintを作成して画面いっぱいにimageを追加します。追加したら先ほど作成したMaterialを割り当ててください。

f:id:tyojugiga:20191017224815p:plain

ここまでできたら、Third PersonのBuluePrintに以下のノードを追加します。StreamingMediaはStream Media Source型、Media PlayerはMedia Player型の変数です。

f:id:tyojugiga:20191017225242p:plain

次に新たにWidget BluePrintを作成して以下のようにtext boxとbuttonを配置します。

f:id:tyojugiga:20191017225841p:plain

そしたら、イベントグラフに以下のノードを追加します。

f:id:tyojugiga:20191017230152p:plain

 

 

これで完成です!!

 

f:id:tyojugiga:20191017230340p:plain

UE4のplayを実行すると上の画像のようになるのでtext boxにURLを入力してplayボタンを押すと・・・

 

f:id:tyojugiga:20191017230708p:plain

動画が再生されます!!!!

 

ここまで読んでいただきありがとうございます!

【UE4】Characterの頭上にTextを表示する

こんにちは。今回はキャラクターの頭上にTextを表示させたいと思います。

まずUI WigetのBPを作成してCanvas PanelにTextを追加します。ここのText部分に書く文字はなんでも大丈夫です。

f:id:tyojugiga:20191011180327p:plain

 

Textを追加したらTextとColor and Opacityにバインドします。

f:id:tyojugiga:20191011180711p:plain

f:id:tyojugiga:20191011180729p:plain

 

次に頭上にTextを表示させたいCharacterのBPにWigetを追加してUser InterfaceのWiget Classに先ほど作成したWigetを指定します。

f:id:tyojugiga:20191011181438p:plain

最後にCharacterのBPのBegin Playに以下のノードを追加します。

f:id:tyojugiga:20191011181657p:plain

 これでPlayすると以下のようになるはずです。

f:id:tyojugiga:20191011181850p:plain


Textの変数に任意の値を入れることで好きなものを表示させることができます!

 

ここまで読んでいただきありがとうございます!

【UE4】C++でランダムなQRコードみたいな模様を作る

こんにちは。今回は読み込むたびに毎回変わる、QRコードみたいな模様を作っていきたいと思います。

まず、c++の新規プロジェクト(基本コード)を作成します。
f:id:tyojugiga:20191003221151p:plain

最初に設置されているFloorのscaleを10くらいに設定しておきます。
locationは(x,y)=(2500,2500)くらいです。
f:id:tyojugiga:20191003221947p:plain


さて、どのように模様を作成していくかというと、ランダムに直方体のactorをspawnさせます。
なのでまず、spawnするactorのblueprint classを作成します。
f:id:tyojugiga:20191003222250p:plain

次に、actorをランダムにspawnさせるためのc++のactorクラス作成してコードを書きます。

spawnActor.h

#pragma once

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

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

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)
		int x;

	UPROPERTY(EditAnywhere)
		int y;

	UPROPERTY(EditAnywhere)
		float w;

	UPROPERTY(EditAnywhere)
		float h;

	UPROPERTY(EditAnywhere)
		float randomChange;

	UPROPERTY(EditAnywhere)
		TSubclassOf<AActor> ActorToSpawn;
};


spawnActor.cpp

#include "spawnActor.h"
#include "Engine/World.h"

// Sets default values
AspawnActor::AspawnActor()
{
 	// 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;

}

// Called when the game starts or when spawned
void AspawnActor::BeginPlay()
{
	Super::BeginPlay();
	UWorld* world = GetWorld();

	

	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			float rnd = FMath::FRandRange(0.0f, 100.0f);

			if (randomChange>=rnd)
			{
				FVector loc((float)j * w, (float)i * h, 120.0f);
				FRotator rot(0.0f, 0.0f, 0.0f);

				world->SpawnActor(ActorToSpawn, &loc, &rot);
			}
		}
	}
}

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

}


ヘッダーファイルでUPROPERTY(EditAnywhere)を宣言することで、UE4側から変数の編集が可能になります。


c++コードがbuildできたら、UE4側でC++のactorクラスをfieldにdrug & dropします。
すると先ほどUPROPERTY(EditAnywhere)で宣言した変数が見れると思いますので自分の好きな値を入力し、TSubclassOf ActorToSpawnに最初に作成したblueprint actor classをattachします。
f:id:tyojugiga:20191003223902p:plain


これで再生をすると・・・

f:id:tyojugiga:20191003224121p:plainf:id:tyojugiga:20191003224126p:plainf:id:tyojugiga:20191003224129p:plain

毎回違った模様が出来上がります!

ここまで読んでいただきありがとうございました!

【Unreal C++】外部ファイルをincludeする

こんにちは。
UE4c++を触っていた時に詰まったことがあったのでブログにまとめます。

c++のコードをvisual studioでbuildするときは、外部のheaderファイルやlibファイルを入れるときにプロジェクトのプロパティからpathやファイル名を設定することができます。

しかし、UE4c++コードをvisual studioでbuildするときは以下のように設定画面が表示されません。

f:id:tyojugiga:20190927103245p:plain

これは、UE4側で様々な設定やファイルを自動で作ってしまうからのようです。
そのため、外部のheaderファイルやlibファイルの設定したいときは、UE4の作成したファイルにpathを記述してあげないといけません。

プロジェクトのファイルの中を見ると、プロジェクト名.Build.csというc#で記述されたファイルがあると思います。ここに設定を書いていきます。
設定方法は以下のようになります。

using UnrealBuildTool;

public class プロジェクト名 : ModuleRules
{
	public プロジェクト名(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

		PrivateDependencyModuleNames.AddRange(new string[] {  });

                //使用するlibファイルのpath
                PublicLibraryPaths.Add("libFilePath");
                //使用するlibファイル名
                PublicAdditionalLibraries.Add("libファイル名");
              //外部ファイルのincludePath
              PublicIncludePaths.Add("includePath");
 
       }
}

これで外部ファイルを使用することができるはずです。

【gRPC】c++のserverとpythonのclientでHello Worldする

前回、gRPCのc++の環境をbuildしたのでそれを利用して、今回はc++のserverとpythonのclientでHello Worldしたいと思います。

gRPCのc++の環境をbuildについては、前回の記事↓を参考にしてください。

https://tyojugiga.hatenablog.com/entry/2019/09/13/004215

また、この記事に出てくるソースコードは以下↓を参考にしています。

https://github.com/grpc/grpc/tree/v1.23.0/examples

 

環境

OS:Windows10 home
Visual Studio:2019
Python:3.7
 

protoファイルを作成する

protoファイル(helloworld.proto)は以下の通りになります。

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
string name = 1;
}

message HelloReply {
string message = 1;
}

c++のserverをつくる

まずc++への翻訳のため先ほど作成したprotoファイルをもとにprotocol bufferを実行します。
前回の記事でbuildしたprotoc.exeとgrpc_cpp_plugin.exeのあるディレクトリにprotoファイルを移動します。
そうしたらコマンドプロンプトを起動してそのディレクトリに移動したうえで以下を実行します。

$protoc.exe -I=. --grpc_out=. --plugin=protoc-gen-grpc=.\grpc_cpp_plugin.exe helloworld.proto

$protoc.exe -I=. --cpp_out=. helloworld.proto

すると以下のファイルが生成されます。

helloworld.pb.h
helloworld.pb.cc
helloworld.grpc.pb.h
helloworld.grpc.pb.cc

次にserverのc++のソースファイルを作成します。
visual studioを開いてc++のプロジェクトを作成します。
server.cppは以下のようになります。

#include <iostream>
#include <memory>
#include <string>

#include <grpc++/grpc++.h>

#include "helloworld.grpc.pb.h"

using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using helloworld::HelloRequest;
using helloworld::HelloReply;
using helloworld::Greeter;

class GreeterServiceImpl final : public Greeter::Service {
	Status SayHello(ServerContext* context, const HelloRequest* request,
		HelloReply* reply) override {
		std::string prefix("Hello ");
		reply->set_message(prefix + request->name());
		return Status::OK;
	}
};

void RunServer() {
	std::string server_address("0.0.0.0:50051");
	GreeterServiceImpl service;

	ServerBuilder builder;
	
	builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
	
	builder.RegisterService(&service);
	
	std::unique_ptr<Server> server(builder.BuildAndStart());
	std::cout << "Server listening on " << server_address << std::endl;

	server->Wait();
}

int main(int argc, char** argv) {
	RunServer();

	return 0;
}

先ほど生成された以下のファイルをソースファイルとヘッダーファイルに追加します。
helloworld.pb.h
helloworld.pb.cc
helloworld.grpc.pb.h
helloworld.grpc.pb.cc

次にincludeパスに以下のディレクトリを追加します。

自分のパス\grpc\include
自分のパス\grpc\third_party\protobuf\src\

f:id:tyojugiga:20190916213327p:plain

次に前回の記事でbuildした以下のファイル名を追加の依存ファイルに追加します。
libprotobuf.lib
grpc.lib
gpr.lib
grpc_unsecure.lib
grpc++_unsecure.lib
Ws2_32.lib
libeay32.lib
ssleay32.lib
zlib.lib

f:id:tyojugiga:20190916213849p:plain

上記libファイルのパスも追加します。(Ws2_32.lib以外)

f:id:tyojugiga:20190916214305p:plain


次に以下を追加します。

  • D_WIN32_WINNT=0x0600

f:id:tyojugiga:20190916214544p:plain

最後にランタイムライブラリをMTにします。

f:id:tyojugiga:20190916214913p:plain

これでbuildできるはずです!!

pythonのclientをつくる

まずライブラリをインストールします。

$ pip install grpcio-tools

次に以下のコードを作成し、先ほど作成したprotoファイルの場所で実行します。

from grpc_tools import protoc

protoc.main(
    (
        '',
        '-I.',
        '--python_out=.',
        '--grpc_python_out=.',
        './helloworld.proto',
    )
)


するとc++の時と同じように以下のファイルが生成されます。
helloworld_pb2.py
helloworld_pb2_grpc.py

次にclientのコード(client.py)を作成します。

from __future__ import print_function
import logging

import grpc

import helloworld_pb2
import helloworld_pb2_grpc


def run():
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        response = stub.SayHello(helloworld_pb2.HelloRequest(name='world'))
    print("Greeter client received: " + response.message)


logging.basicConfig()
run()

client側はこれで完成です。

Hello Worldの実行

それではコマンドプロンプトを二つ起動させてserver→clientの順で実行します。
すると以下のようになるはずです。
f:id:tyojugiga:20190916220529p:plain

Hello Worldできました!!

ここまで読んでいただきありがとうございます!
ご意見、ご質問等ありましたらコメントしていただけると嬉しいです。

gRPC(c++)をVisual Studio2019でbuildする

最近、gRPC(c++)を導入する機会があったので、その導入までまとめておきます。

環境

  • OS:Windows10 home
  • Visual Studio:2019
  • CMake:3.15.3
  • gRPC:1.2.5
  • Protocol Buffers:3.9.1
  • zlib:1.2.11
  • Active Perl:5.28.1
  • Openssl:1.0.2l

 1.Protocol Buffersのbuild

gRPCについては新しいversionが出ていますが、vsprojectsのディレクトリが入ってないので、本記事では1.2.5を使用します。Protocol Buffersのbuildについては、以下の記事にわかりやすく掲載されていますので参考にしてください。

https://qiita.com/yuzo777/items/197196b80d8abd5f6566

 

 2.grpc_protoc_plugins.sinのbuild

grpc\vsprojects\protobuf.slnをDebugモードとReleaseモードでbuildした結果作成されるgrpc\third_party\protobuf\cmake\build\solution\x64\Debugとgrpc\third_party\protobuf\cmake\build\solution\x64\Releaseをgrpc\third_party\protobufにコピーした状態で、grpc\vsprojectsにあるgrpc_protoc_plugins.sinをbuildするとうまくいきます。buildする際はReleaseモードでx64にしてください。

f:id:tyojugiga:20190912234133p:plain

 

 3.grpc.sinのbuild

grpc.sinをbuildするには以下のものをインストールする必要があります。

  • zlib
  • ActivePerl
  • Openssl

zlibについてはいかの記事にわかりやすく掲載されていますので参考にしてください。

http://maradick-yamato.blogspot.com/2018/10/zliblibpng.html

生成されたzlibstat.libをzlib.libにrenameしてgrpc\vsprojects\vcxproj\grpc_dllにコピーしてください。

同じくActivePerlとOpensslについても以下の記事にわかりやすく掲載されています。

https://kagasu.hatenablog.com/entry/2017/10/03/143232

Opensslについても新しいversionだとうまくbuildできないため、1.0.2lを使用しています。openssl\out32dllにlibeay.libとssleay.libが生成されているのでそれをgrpc\vsprojects\vcxproj\grpc_dllにコピーしてください。

 

以上ができたらいよいよgrpc\vsprojects\grpc.sinをbuildします。

そのままbuildしようとすると以下のようなエラーが発生しますのでgrpc_dllにあるgrpc.defのエラー部分を削除します。これはProtocol Buffersのところで紹介した記事にも掲載されています。

f:id:tyojugiga:20190913003233p:plain

 もう一度buildすると以下ようなエラーがでますので対象の部分をint→size_tに直します。

f:id:tyojugiga:20190913003640p:plain

 

これでbuidは完了です。お疲れさまでした!

 

ここまで読んでいただきありがとうございます!ご意見、ご質問等ありましたらコメントしていただけるとありがたいです。

ue4 skeletal meshを破壊する

こんにちは。

はじめましてtyojugigaと申します。

私は、趣味でue4を触っているので今後はそのことに関する記事を中心にあげられればなぁと思います。

 

早速ですがこの記事の題の通りskeletal meshを破壊したいと思います。

本来skeletal meshは破壊できないのですが小技を使って破壊します。

 

やり方としては

①skeletal meshからstatic meshを作成

       ↓

②static meshから非破壊meshを作成

       ↓

③任意のボタンを押したらcharacterが見えなくなるようにする

       ↓

④characterが見えなくなると同時に非破壊meshをスポーンする

       ↓

⑤非破壊meshを破壊する

 

間接的ですが以上の手順でskeletal meshを破壊(したように見せることが)できます。

 

①skeletal meshからstatic meshを作成

 以下のようにskeletal meshを開きstatic meshを作成のボタンを押します。

f:id:tyojugiga:20190905224902p:plain

 

②static meshから非破壊meshを作成

①の作業を行うとstatic meshができるので、以下のように非破壊meshを作成します。

※非破壊meshはApex Destructionというプラグインを入れることで利用できます。

f:id:tyojugiga:20190905225511p:plain

すると以下の画面が出てくるのでFracture Meshのボタンを押して保存します。

f:id:tyojugiga:20190905225807p:plain

そしたら新たにActorのblue printを作成しDestructibleコンポーネントを追加します。

f:id:tyojugiga:20190905230201p:plain

 

③任意のボタンを押したらcharacterが見えなくなるようにする

              &

④characterが見えなくなると同時に非破壊meshをスポーンする

次にcharacterのblue printを開き以下のノードを追加します。

するとBボタンを押したときにcharacterが見えなくなります。

それと同時に先ほど作成した非破壊meshのblue printクラスをスポーンします。

f:id:tyojugiga:20190905230456p:plain

 

⑤非破壊meshを破壊する

最後に非破壊meshのblue printに以下のノードを追加します。

f:id:tyojugiga:20190905230817p:plain

 

これでskeletal meshを疑似的に破壊させることができます!

f:id:tyojugiga:20190905231059g:plain

 

 

初めてで拙い説明になってしまいましたが最後まで読んでいただきありがとうございました!