на респаун с помощью стандартной функции ГеймМода RestartPlayer(GetWorld()->GetFirstPlayerController());.
Есть турель, которая хранит поле APawn* PlayerPawn и определяет его на BeginPlay как PlayerPawn = GetWorld()->GetFirstPlayerController()->GetPawn();
Турель наводится лайн трейсом и всё хорошо до того момента, пока игрок не умирает. После смерти и возрождения лайн трейс перестает выцеливать игрока. Почему? Ведь не смотря на то, что игрок уничтожается-создается указатель же тот же..
А точно ли это тот же указатель? Павн вроде бы пересоздается после смерти
Так пересоздается-то павн, а указатель остаётся тот же, по идее. Но, как ни странно, вопрос решился после того, как я убрал указатель из поля класса, перестал его определять на бегин плее, а просто стал вызывать GetFirstPlayerController()->GetPawn(); в методе прицеливания
Ну это логично, теперь вы всегда берете актуального павна, а раньше кешировали указатель на старого
Т.е. получается, что меняется адрес, на который ссылается указатель? Почему-то я об этом не подумал. Спасибо)
Я бы сказал по-другому, новый павн это просто другой не связанный со старым павном объект и поэтому у них разные адреса.
Логично. Сейчас осознал картину целиком и полностью признаю Вашу правоту. Мой вариант прокатил бы только в том случае, если это был бы константный указатель
Не совсем правильно выразился.. Я имею ввиду, если бы функция GetWorld()->GetFirstPlayerController()->GetPawn() возвращала бы константный указатель. Т.е. если бы в движке зачем-то была реализована такая штука, что павн первого плеера всегда создавался бы в одной области памяти) //всё больше понимаю, что нужно было просто задуматься и не городить говнокод)
@gameraccoon парни, я подолью масла в огонь вашего обсуждения, при вызове RestartPlayer Pawn игрока не пересоздаётся (если он до этого существовал), там будет тот же самый указатель. Игорь, ты уверен, что перед рестартом игрока ты не прибиваешь сам Pawn?
Вопрос интересный, павн вызывает респаун в 2 случаях - либо на EndPlay, например после смерти по KillZ, либо по делегату от HelthCompinent. Сначала я там просто вызывал респаун, без дестроя - целиться турели переставал . Сейчас я там просто вызываю дестрой и все.
Сложно сказать, не видя вводных, но при обычном вызове рестарта твой указатель никуда не потеряется и будет указывать на того же персонажа (просто он появится на точке старта), так что почти уверен, что он у тебя прибивался каким-то другим образом, например через тот же твой HealthComponent
Обсуждают сегодня