VahapZTL

Yeni üye
7 Haz 2015
46
3
0
32
(61) Trabzon
Merhaba arkadaşlar HUD classından kalıtım alarak kendi classımı yazdım derlemede herhangi bir problem olmadı fakat widget bp de fonksiyonlarımı göremedim UFUNCTION ve UPROPERTY kullandığım zaman bu ikisinde ";" unutulmuş diye hata veriyor bunun sebebi nedir?

Widget BP için başka bir classtan mı kalıtım almam gerek?

Random sayıları sadece BP den mi üretebiliyoruz internette C++ kod örneği aradım fakat bulamadım, BP den yaptığım zaman oyun çalıştığı sürece sürekli değer üretiyor?

Text Bind'a Widget BP üzerinden ulaşabilir miyim?

Şimdiden teşekkür ederim.
 
VahapZTL' Alıntı:
Merhaba arkadaşlar HUD classından kalıtım alarak kendi classımı yazdım...Widget BP için başka bir classtan mı kalıtım almam gerek?
Aynen; UUserWidget sınıfından kalıtım almalısın. Editör üzerinde de UserWidget olarak gözükür. BP User Widget oluşturup Reparent diyerek de C++ tarafındaki halinden kalıtım aldırabilirsin.


VahapZTL' Alıntı:
Merhaba arkadaşlar HUD classından kalıtım alarak kendi classımı yazdım derlemede herhangi bir problem olmadı fakat widget bp de fonksiyonlarımı göremedim UFUNCTION ve UPROPERTY kullandığım zaman bu ikisinde ";" unutulmuş diye hata veriyor bunun sebebi nedir?
dvl' Alıntı:
Kodları konuya ekleyebilir misin?
Aynen o satırları bir görelim. Normalde public yada protected olması gerekir, private olursa da hata verir ama bunu görürdün zaten.
Kod:
public:
    UPROPERTY(...) FString WidgetTitle;

VahapZTL' Alıntı:
Random sayıları sadece BP den mi üretebiliyoruz internette C++ kod örneği aradım fakat bulamadım, BP den yaptığım zaman oyun çalıştığı sürece sürekli değer üretiyor?
Hayır, mantıksal olarak Blueprint tarafında yapabildiğin her şeyi C++ tarafında da yapabilirsin. Standart random kütüphanesi Math kütüphanesi içindedir.
https://docs.unrealengine.com/latest/INT/API/Runtime/Core/Math/FRandomStream/index.html
Kod:
float RandomSingle = FMath::FRandRange(0.0F, 100.0F);

VahapZTL' Alıntı:
Text Bind'a Widget BP üzerinden ulaşabilir miyim?
Bununla ne kastettiğini anlamadım. İster Blueprint tarafında ister C++ tarafında olsun Widget üzerindeki her hangi bir Property, Bind edilebilir.


Ekleme:
C++ üzerinde aldığın derleme hataları anlamsız gibi gözüküyorsa yada sebebi anlayamıyorsan sırasıyla şu adımları takip edebilirsin, ben sıklıkla öyle yapıyorum:

1. Öncelikle Error List yerine Output penceresinde beliren hataya bakıyorum. UE4 C++ üzerinde hataların birçoğu Reflection System ile ilgili oluyor ve VC++ bu hataları tanımıyor yada yanlış gösteriyor, ancak; Output penceresinde UBT hatalarını doğru ve anlamlı bir  biçimde görebiliyorsun.
2. Generated kod dosyaları ya Generate edilememiştir yada eksik/yanlış Generate edilmiştir. Bunun için projeden tamamen çıkmalı ve proje dosyasına sağ tıklayıp Generate Visual Studio project files seçeneğini seçmelisin. Hatta bunu yapmadan Visual Studio'yu kapatmadan önce bir de Build penceresi altında Clean etmek yararlı olabilir. İşlemler bitince Visual Studio projesini açıp tekrar derleyebilirsin.
 
UFUNCTION() ve UPROPERTY() şimdi çalıştı fakat fonksiyonlarımı BP de yine göremiyorum.

Header Dosyası

Kod:
#pragma once

#include "math.h"

#define IndexSize 9

class MYPROJECT_API NumberGenerator
{
public:

 int SayiDizi[IndexSize];

 NumberGenerator();

 UFUNCTION(EditAnywhere, BlueprintReadOnly, Category = Benim)
 void SayiUret(int a[IndexSize]);

 ~NumberGenerator();
};

Cpp Dosyası

Kod:
// Fill out your copyright notice in the Description page of Project Settings.

#include "MyProject.h"
#include "NumberGenerator.h"

NumberGenerator::NumberGenerator()
{
 for (int i = 0; i < 9; i++)
 {
 SayiDizi[i] = 0;
 }
}

void NumberGenerator::SayiUret(int a[IndexSize])
{
 for (int i = IndexSize - 1; i > 0; i--)
 {
 // Randomize a number between 0 and i (so that the range decreases each time)
 int rnd = FMath::RandRange(0, i);

 // Save the value of the current i, otherwise it'll overright when we swap the values
 int temp = a[i];

 // Swap the new and old values
 a[i] = a[rnd];
 a[rnd] = temp;
 }
}

NumberGenerator::~NumberGenerator()
{
}
 
VahapZTL' Alıntı:
UFUNCTION() ve UPROPERTY() şimdi çalıştı fakat fonksiyonlarımı BP de yine göremiyorum.

1. Öncelikle bu kod derlenmiş olamaz.
2. Reflection System sadece UCLASS, USTRUCT ile çalışır.
3. EditAnywhere ve BlueprintReadOnly UPROPERTY düzenleyicisidir UFUNCTION ile kullanılamaz. BlueprintCallable/BlueprintPure kullanılabilir.
4. Math kütüphanesinden kastım standart math.h değil, UE4 Math kütüphanesidir. Herhangi bir başlık dosyası eklemeye gerek yok doğrudan FMath isim uzayı altından çağrılabilir.
5. UCLASS ile yıkıcı(destructor) kullanmaya gerek yoktur hatta yanlış olur. UE4 çöp toplayıcı(Garbage Collector) sisteme sahiptir.
6. UCLASS eklerken Editör üzerinden bir alt sınıf da seçerek ekleyebilirsin, o zaman doğru şekilde ekleyecektir, hem nasıl olduğunu görmüş olursun.
7. Yok illa ki Native C++ sınıfı ekleyeceğim diyorsan, üzerinde Reflection System kullanmamalısın.
8. SayiUret fonksiyonu çalışsaydı bile parametre alacak, çıkış üretmeyecekti(bkz: Out of Scope).
9. UserWidget oluşturmak istediğini söylemiştin ama sınıf herhangi birşeyden kalıtım almıyor?
 
1)UserWidget yada WidgetBinding den kalıtım almaya çalıştığımda aşağıdaki hatayı veriyor onun için Native class oluşturdum
(Yeni bir proje açtım herhangi bir class tan kalıtım alarak C++ classı eklemeye çalıştım fakat yine aşağıda ki hatayı aldım.)

Kod:
Successfully added class 'MyWidgetBinding', however you must recompile the 'MyProject' module before it will appear in the Content Browser. Failed to automatically hot reload the 'MyProject' module.

2) Yazdığım kod hata vermeden derlendi vermesi gerekiyorsa bilmiyorum tabi :)

3)SayiUret Fonksiyonu geriye bir değer döndürmesi gerekmiyor sadece diziye random olarak sayı atamasını gerek.
 
VahapZTL' Alıntı:
1)UserWidget yada WidgetBinding den kalıtım almaya çalıştığımda aşağıdaki hatayı veriyor onun için Native class oluşturdum
(Yeni bir proje açtım herhangi bir class tan kalıtım alarak C++ classı eklemeye çalıştım fakat yine aşağıda ki hatayı aldım.)

Kod:
Successfully added class 'MyWidgetBinding', however you must recompile the 'MyProject' module before it will appear in the Content Browser. Failed to automatically hot reload the 'MyProject' module.

Aslında kod eklenmiş, editör üzerinden build edilememiş. Bu durumda editörü kapatıp, VS üzerinden derleyebilirsin. Derlenecektir, derlenmese de hatayı görebilirsin.


VahapZTL' Alıntı:
2) Yazdığım kod hata vermeden derlendi vermesi gerekiyorsa bilmiyorum tabi :)
UBT her zaman hata üretmeyebilir. UFUNCTION ile kullanılan Property Specifiers bile hatalı, hata vermesi gerekirdi. Vermemiş de olabilir.

VahapZTL' Alıntı:
3)SayiUret Fonksiyonu geriye bir değer döndürmesi gerekmiyor sadece diziye random olarak sayı atamasını gerek.
Sorun değil, parametre olarak verilecek olan diziye rastgele değer atamasını yapar,  ancak fonksiyonun işlemi bittiğinde bu değer korunmaz. Sonuç olarak dizinin değerleri fonksiyon çağrılmadan önceki gibi kalır.

Kod:
NumberGenerator ng = NumberGenerator();
int a[9] = {0};  // Dizi oluşturuldu ve "0" ile ilklendi.
ng.SayiUret(a);  // Fonksiyon çalışma sırasında a'nın elemanlarının değerlerini değiştirir.
// Fonksiyonun işi bittiğinde a'nın tüm elemanları yine 0 değerini korur.

Ne Yapmalı?

1. Parametreyi Referans Olarak Vermek (Pass-by-Reference)
Kod:
void SayiUret(int (&a)[IndexSize])

2. Sınıf Üyesini Kullanmak
Fonksiyon içinde sınıf üzerinde bulunan SayiDizi elemanına rastgele değer ataması yapılabilir ve fonksiyon çağrıldıktan sonra aldığı yeni değer kullanılır.
Kod:
void NumberGenerator::SayiUret() // Parametre yok.
{
    for (int i = IndexSize - 1; i > 0; i--)
    {
        // Randomize a number between 0 and i (so that the range decreases each time)
        int rnd = FMath::RandRange(0, i);

        // Save the value of the current i, otherwise it'll overright when we swap the values
        int temp = a[i];

        // Assign random number to array member.
        SayiDizi[i] = rnd;
    }
}
Kullanış:
Kod:
NumberGenerator ng = NumberGenerator();
ng.SayiUret();
int random0 = ng.SayiDizi[0];

C++ ile doğrudan ilgili bu durumlar bir tarafa UE4 ile ilgili belirtiğim durumlar hala geçerlidir.
 
Sıfırdan proje açtım herhangi bir sıkıntı olmadı class eklemeye çalıştım aynı hatayı verdi VS üzerinden derledim herhangi bir hata vermedi fakat class ı ekledikten sonra VS üzerinde derleme yapamamaya başladım.

".uproject" dosyasına sağ tıklayıp Generate VS project files tıkladım aşağıdaki hatayı aldım.
XkLQrj.png


Evet'e tıkladığımda ise aşağıdaki hatayı alıyorum.
bDJzd0.png


VS üzerinde Clean yaptığımda herhangi bir hata vermiyor Rebuild yapınca;
Output penceresi:
Kod:
1>------ Rebuild All started: Project: UE4, Configuration: BuiltWithUnrealBuildTool Win32 ------
2>------ Rebuild All started: Project: SayiTahmin, Configuration: Development_Editor x64 ------
2>  \Epic was unexpected at this time.
2>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.MakeFile.Targets(42,5): error MSB3073: The command ""C:\Program Files (x86)\Epic Games\4.10\Engine\Build\BatchFiles\Rebuild.bat" SayiTahminEditor Win64 Development "C:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\SayiTahmin.uproject" -rocket -waitmutex" exited with code 255.
========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ==========

Error List penceresi:
Kod:
Severity Code Description Project File Line Suppression State
Error MSB3073 The command ""C:\Program Files (x86)\Epic Games\4.10\Engine\Build\BatchFiles\Rebuild.bat" SayiTahminEditor Win64 Development "C:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\SayiTahmin.uproject" -rocket -waitmutex" exited with code 255. SayiTahmin C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.MakeFile.Targets 42 
Error (active) name followed by '::' must be a class or namespace name SayiTahmin c:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\Source\SayiTahmin\Private\NumberGen.cpp 6

Build Yaptığımda:

Output Penceresi

Kod:
1>C:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\Source\SayiTahmin\Private\NumberGen.cpp(6): error C2653: 'NuberGen': is not a class or namespace name
1>  -------- End Detailed Actions Stats -----------------------------------------------------------
1>ERROR : UBT error : Failed to produce item: C:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\Binaries\Win64\UE4Editor-SayiTahmin.dll
1>  Total build time: 40,13 seconds
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.MakeFile.Targets(37,5): error MSB3073: The command ""C:\Program Files (x86)\Epic Games\4.10\Engine\Build\BatchFiles\Build.bat" SayiTahminEditor Win64 Development "C:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\SayiTahmin.uproject" -rocket -waitmutex" exited with code -1.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Error List Penceresi:

Kod:
Severity Code Description Project File Line Suppression State
Error MSB3073 The command ""C:\Program Files (x86)\Epic Games\4.10\Engine\Build\BatchFiles\Build.bat" SayiTahminEditor Win64 Development "C:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\SayiTahmin.uproject" -rocket -waitmutex" exited with code -1. SayiTahmin C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.MakeFile.Targets 37 
Error Failed to produce item: C:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\Binaries\Win64\UE4Editor-SayiTahmin.dll SayiTahmin C:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\Intermediate\ProjectFiles\ERROR 1 
Error C2653 'NuberGen': is not a class or namespace name SayiTahmin C:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\Source\SayiTahmin\Private\NumberGen.cpp 6 
Error (active) name followed by '::' must be a class or namespace name SayiTahmin c:\Users\VahapZTL\Documents\Unreal Projects\SayiTahmin\Source\SayiTahmin\Private\NumberGen.cpp 6


Nerede yanlış yapıyorum anlamadım??
 
VahapZTL' Alıntı:
Sıfırdan proje açtım herhangi bir sıkıntı olmadı class eklemeye çalıştım aynı hatayı verdi VS üzerinden derledim herhangi bir hata vermedi fakat class ı ekledikten sonra VS üzerinde derleme yapamamaya başladım.

".uproject" dosyasına sağ tıklayıp Generate VS project files tıkladım aşağıdaki hatayı aldım.
XkLQrj.png


Nerede yanlış yapıyorum anlamadım??

Bu hatadan emin misin, bu hatayı derlenmemiş projeyi doğrudan editör ile başlatmaya çalışınca alman gerekir. Sağ tıklayıp Generate VS Project Files dendiğinde böyle bir hata vermemesi gerekir.
 
O hataları bir şekilde hallettim ama nasıl hallettiğim konusunda hiç bir fikrim yok. Neyse yeni bir proje açtım yukarıda aldığım hataları almadım class ı oluşturdum fakat yazdığım kodları derlemesine rağmen(Daha önce denediklerim) BP de yine kullanamıyorum, şuan ki mevcut kodlarımı derlemiyor onlarada bir bakarsan sevinirim.

Header Dosyası:

Kod:
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "Blueprint/UserWidget.h"
#include "NumberGen.generated.h"

UCLASS()
class PROJEM_API UNumberGen : public UUserWidget
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")
	int SayiDizisi[9];

	UFUNCTION(BlueprintCallable, Category = "AAA")
	static void SayiUret(int & SayiDizisi);
};

C++ Dosyası:

Kod:
// Fill out your copyright notice in the Description page of Project Settings.

#include "Projem.h"
#include "../Public/NumberGen.h"

void UNumberGen::SayiUret()
{
	for (int i = 8; i > 0; i--)
	{
		int rnd = FMath::RandRange(0, i);

		int temp = SayiDizisi[i];

		SayiDizisi[i] = SayiDizisi[rnd];
		SayiDizisi[rnd] = temp;
	}
}
Aldığım hata :
Kod:
Error C:/Users/VahapZTL/Documents/Unreal Projects/Projem/Source/Projem/Public/NumberGen.h(15)  : Unrecognized type 'int' - type must be a UCLASS, USTRUCT or UENUM
 
Hatada belirtmiş, int bilindik bir tip değil diye. Native Class olsaydı sorun yoktu. UE4'te int yoktur, onun yerine int32 vardır.

Diğer taraftan Native Array, Reflection System kapsamı dışında, onun yerine de TArray kullanmalısın.

Kod:
TArray<int32> SayiDizisi;

Bir hata da fonksiyonda var. Fonksiyon ya parametre alan static bir fonksiyon olmalı ya da sınıfın üyesi yazmalı. İkisi birden olmaz, static metot, sınıfın üyelerine erişemez, çünkü bu erişim sınıfın bir örneğinin oluşturulmasını gerektirir. Oysa static metot sınıfın bir üyesi oluşturulmadan kullanılır. Bu durumda ya static ifadesini kaldırmalısın ya da eriştiği üyeyi de static tanımlamalısın.

C++ zor bir programlama dilidir, öğrenirken oldukça zorlanmıştım ama UE4 ile öğrenmek tam bir kabus olsa gerek. Bir kaç yerde gördüm "Learning C++ with UE4" gibi bir kitap var sanırım ama bana hiç de mantıklı gelmiyor.
 
Seni de çok yoruyom ama bu hatanın sebebi nedir?

Kod:
Error C:/Users/VahapZTL/Documents/Unreal Projects/Projem/Source/Projem/Public/NumberGen.h(18)  : Function parameter: 'SayiDizisi' conflicts with previously defined field in 'NumberGen'

.H :
Kod:
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "Blueprint/UserWidget.h"
#include "NumberGen.generated.h"

UCLASS()
class PROJEM_API UNumberGen : public UUserWidget
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")
	TArray<int32> SayiDizisi;

	UFUNCTION(BlueprintCallable, Category = "AAA")
	static void RndNumGen(TArray<int32> & SayiDizisi);
};

.Cpp :

Kod:
// Fill out your copyright notice in the Description page of Project Settings.

#include "Projem.h"
#include "../Public/NumberGen.h"

void UNumberGen::RndNumGen(TArray<int32>& SayiDizisi)
{
	for (int i = 0; i < 9; i++)
	{
		int32 rnd = FMath::RandRange(0, 9);

		if (!SayiDizisi.Contains(rnd))
		{
			SayiDizisi.Add(rnd);
		}

		if (SayiDizisi.Num() == 9)
		{
			break;
		}
	}
}
 
VahapZTL' Alıntı:
Seni de çok yoruyom ama bu hatanın sebebi nedir?
Kod:
Error C:/Users/VahapZTL/Documents/Unreal Projects/Projem/Source/Projem/Public/NumberGen.h(18)  : Function parameter: 'SayiDizisi' conflicts with previously defined field in 'NumberGen'

Sorun değil.

"Fonksiyon parametresi (SayiDizisi) 'NumberGen' üzerinde daha önceden tanımlanmış alanla karışıyor" diyor.

Kullanmıyorsan sınıf içindeki SayiDizisi isimli üyeyi kaldırmalısın yada farklı isimler kullanmalısın.
 
Normal bir Cpp projesi olsa main de değişkeni tanımla kullanda burada nasıl kullanacağım konusunda en ufak bir fikrim yok benim amacım şuydu yazdığım fonksiyon ve değişkeni BP de kullanmaktı yani o TArray<int32> Sayi.. bu değişkeni BP de get ile alıp Fonksiyona bağlayacaktım fonksiyonda random sayılar atıp diziyi set edecekti.
 
VahapZTL' Alıntı:
Normal bir Cpp projesi olsa main de değişkeni tanımla kullanda burada nasıl kullanacağım konusunda en ufak bir fikrim yok benim amacım şuydu yazdığım fonksiyon ve değişkeni BP de kullanmaktı yani o TArray<int32> Sayi.. bu değişkeni BP de get ile alıp Fonksiyona bağlayacaktım fonksiyonda random sayılar atıp diziyi set edecekti.
Normal CPP projesi de o kadar basit olmamalı.

Senin probleminde Property olarak vermiş olduğun üyeyi(aşağıdaki satırlar) kaldırman yeterli.

Kod:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")
    TArray<int32> SayiDizisi;

Bağımsız, kullanılabilir fonksiyonlar üretirken BlueprintFunctionLibrary oluşturmak daha mantıklıdır. Widget kendisi üzerinde sadece doğrudan kendisi ile alakalı birşeyi bulundurması daha mantıklı. Yine de farketmez.

MyBlueprintFunctionLibrary Header
Kod:
UFUNCTION(BlueprintPure, Category = Singleton) static TArray<int32> GenerateRandomArray(int32 Count, int32 Range);

MyBlueprintFunctionLibrary Source
Kod:
TArray<int32> UMyBlueprintFunctionLibrary::GenerateRandomArray(int32 Count, int32 Range)
{
    TArray<int32> GeneratedNumbers;
    for (int32 i = 0; i < Count; i++)
    {
        int32 randomNumber = FMath::RandRange(0, Range);
        GeneratedNumbers.Add(randomNumber);
    }
    return GeneratedNumbers;
}

Bu şekilde de istenilen her yerden kullanılabilir (sadece Widget üzerinden değil).

Ekli dosyayı görüntüle 7Ekli dosyayı görüntüle 8Ekli dosyayı görüntüle 9
 

Ekli dosyalar

  • 0.png
    0.png
    41.2 KB · Görüntüleme: 10
  • 1.png
    1.png
    146.1 KB · Görüntüleme: 5
  • 2.png
    2.png
    335.5 KB · Görüntüleme: 6