Задать вопрос

Почему обнуляется указатель?

Имеется такой кусок кода

ANCGAmmo* Item = Cast<ANCGAmmo>(CurrentAmmo.AmmoType);
ANCGBaseCharacter* CharOwner = Cast<ANCGBaseCharacter>(GetOwner());
CharOwner->StorageComponent->GetItemByType(UsingAmmo, Qt);

CurrentAmmo это структура ниже
USTRUCT(BlueprintType)
struct FAmmoData {
	GENERATED_USTRUCT_BODY()

	UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Weapon|Ammo data")
		int32 Bullets;

	UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Weapon|Ammo data")
		TSubclassOf<ANCGAmmo> AmmoType;

	UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Weapon|Ammo data")
		bool Infinite;

};


Проблема в том, что в момент каста CharOwner указатель на Item становится NULL и в GetItemByType уже летит NULL. Пробовал ни BeginPlay CurrentAmmo.AmmoType присваивать в переменную класса, но итог один.
Есть подозрение что я что-то упускаю.
  • Вопрос задан
  • 104 просмотра
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@trjflash Автор вопроса
Видимо я где то пропустил кусок мануала, что бы сравнить блупринтовый элемент с его плюсовым родителем, при передачами между функциями нужно использовать TSubclassOf, потом кастить его к нужному классу и после этого сравнивать. Для меня работает следующим образом

GetAmmoFromInventory(CurrentAmmo.AmmoType, Qt);

void ANCGRangeWeapon::GetAmmoFromInventory(TSubclassOf<ANCGAmmo> ItemType, int32& AmmoCount) {
	ANCGBaseCharacter* CharOwner = Cast<ANCGBaseCharacter>(this->GetOwner());
	CharOwner->StorageComponent->GetAmmoByType(ItemType, AmmoCount);
}

void UNCGStorageComponent::GetAmmoByType_Implementation(TSubclassOf<ANCGAmmo> ItemToSearch, int32& Quantity)
{
	
	if (ItemToSearch == nullptr) {
		Quantity = 0;
		return;
	}
	
	const auto Item = Cast<ANCGBaseItem>(ItemToSearch->GetDefaultObject());

	for (ANCGBaseItem* CurrentItem : StorageItems)
	{
		if (CurrentItem->GetClass() == Item->GetClass()) {
			Quantity = CurrentItem->Count;
		}
	}
	
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы