【UE4】text boxに入力したURLの動画を再生する
こんにちは。今回は、UE4で動画を再生させてみようと思います。
まずは、何でもよいのですがThird PersonのBuluePrintClassをします。
作成したらcontentの中にStream Media Sourceを追加します。
次にMedia Playerを追加します。
追加しようとすると以下のような表示が出るのでチェックします。
するとTextureが生成されるので、そのMaterialを作成します。
次にWidget BluePrintを作成して画面いっぱいにimageを追加します。追加したら先ほど作成したMaterialを割り当ててください。
ここまでできたら、Third PersonのBuluePrintに以下のノードを追加します。StreamingMediaはStream Media Source型、Media PlayerはMedia Player型の変数です。
次に新たにWidget BluePrintを作成して以下のようにtext boxとbuttonを配置します。
そしたら、イベントグラフに以下のノードを追加します。
これで完成です!!
UE4のplayを実行すると上の画像のようになるのでtext boxにURLを入力してplayボタンを押すと・・・
動画が再生されます!!!!
ここまで読んでいただきありがとうございます!
【UE4】Characterの頭上にTextを表示する
こんにちは。今回はキャラクターの頭上にTextを表示させたいと思います。
まずUI WigetのBPを作成してCanvas PanelにTextを追加します。ここのText部分に書く文字はなんでも大丈夫です。
Textを追加したらTextとColor and Opacityにバインドします。
次に頭上にTextを表示させたいCharacterのBPにWigetを追加してUser InterfaceのWiget Classに先ほど作成したWigetを指定します。
最後にCharacterのBPのBegin Playに以下のノードを追加します。
これでPlayすると以下のようになるはずです。
Textの変数に任意の値を入れることで好きなものを表示させることができます!
ここまで読んでいただきありがとうございます!
【UE4】C++でランダムなQRコードみたいな模様を作る
こんにちは。今回は読み込むたびに毎回変わる、QRコードみたいな模様を作っていきたいと思います。
まず、c++の新規プロジェクト(基本コード)を作成します。
最初に設置されているFloorのscaleを10くらいに設定しておきます。
locationは(x,y)=(2500,2500)くらいです。
さて、どのように模様を作成していくかというと、ランダムに直方体のactorをspawnさせます。
なのでまず、spawnするactorのblueprint classを作成します。
次に、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
これで再生をすると・・・
毎回違った模様が出来上がります!
ここまで読んでいただきありがとうございました!
【Unreal C++】外部ファイルをincludeする
こんにちは。
UE4でc++を触っていた時に詰まったことがあったのでブログにまとめます。
c++のコードをvisual studioでbuildするときは、外部のheaderファイルやlibファイルを入れるときにプロジェクトのプロパティからpathやファイル名を設定することができます。
しかし、UE4のc++コードをvisual studioでbuildするときは以下のように設定画面が表示されません。
これは、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\
次に前回の記事でbuildした以下のファイル名を追加の依存ファイルに追加します。
libprotobuf.lib
grpc.lib
gpr.lib
grpc_unsecure.lib
grpc++_unsecure.lib
Ws2_32.lib
libeay32.lib
ssleay32.lib
zlib.lib
上記libファイルのパスも追加します。(Ws2_32.lib以外)
次に以下を追加します。
- D_WIN32_WINNT=0x0600
最後にランタイムライブラリをMTにします。
これで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の順で実行します。
すると以下のようになるはずです。
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にしてください。
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のところで紹介した記事にも掲載されています。
もう一度buildすると以下ようなエラーがでますので対象の部分をint→size_tに直します。
これで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を作成のボタンを押します。
②static meshから非破壊meshを作成
①の作業を行うとstatic meshができるので、以下のように非破壊meshを作成します。
※非破壊meshはApex Destructionというプラグインを入れることで利用できます。
すると以下の画面が出てくるのでFracture Meshのボタンを押して保存します。
そしたら新たにActorのblue printを作成しDestructibleコンポーネントを追加します。
③任意のボタンを押したらcharacterが見えなくなるようにする
&
④characterが見えなくなると同時に非破壊meshをスポーンする
次にcharacterのblue printを開き以下のノードを追加します。
するとBボタンを押したときにcharacterが見えなくなります。
それと同時に先ほど作成した非破壊meshのblue printクラスをスポーンします。
⑤非破壊meshを破壊する
最後に非破壊meshのblue printに以下のノードを追加します。
これでskeletal meshを疑似的に破壊させることができます!
初めてで拙い説明になってしまいましたが最後まで読んでいただきありがとうございました!