Главная Юзердоски Каталог Трекер NSFW Настройки

Бред

Ответить в тред Ответить в тред
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 77 3 29
Аноним 26/06/26 Птн 17:54:04 334358344 1
image.png 238Кб, 330x396
330x396
Анальник-наносек, вот скажи мне, я хочу сделать игру как Portal 2. Мне для этого надо нанять анальника-сеньора, чтобы он мне сделал математику / архитектуру порталов на выбранном движке? Предположим UE, в меньшей степени склоняюсь к Юнити. Или справится и мидл с таким хардкором? Или нужна целая команда анальников?

Потому что чатжопа и близко не может реализовать такое. А всё, что я в интернете видел платное или бесплатное — хуита отдаленно напоминающая механику порталов. Там либо криво телепортация работает, либо проецируется криво текстура, либо в пизду идет оптимизация.

Тз грубо говоря: масштабируемый проект на анриле с работающими порталами.
Всю остальную лабуду с кнопками и постами я и сам смогу на блюпринтах. Сколько такое стоит под ключ?
Аноним 26/06/26 Птн 17:55:45 334358382 2
Бамп
Аноним 26/06/26 Птн 17:57:04 334358410 3
>>334358344 (OP)
Скиньте нейровебмку где избы на курьих ножках и эльфы грабять корованы.
Аноним 26/06/26 Птн 17:58:00 334358432 4
75F636E867C8830[...].png 1164Кб, 1266x2560
1266x2560
>>334358344 (OP)
Ты просто не умеешь пользоваться нейронкой, а так они уже ааа-игры делоют
Аноним 26/06/26 Птн 17:58:46 334358452 5
>>334358344 (OP)
Тебе человек 20 минимум надо для нормальной 3д игры даже на готовом халявном движке.
Я лет 10 газад рпг сделал изометрическую в соло (с готовой графикой), заебался просто вкрай, несколько лет пахоты.
Аноним 26/06/26 Птн 17:58:56 334358457 6
Бамп
Аноним 26/06/26 Птн 17:59:52 334358484 7
>>334358432
>Ты просто не умеешь пользоваться нейронкой
Ну может сеньору помидору она и сможет выдать необходимое. Но так синьор и сам такое знает и понимает. А мне она хуйню выдаёт
Аноним 26/06/26 Птн 18:01:20 334358523 8
>>334358452
>Тебе человек 20 минимум надо для нормальной 3д игры даже на готовом халявном движке.
Так я про кор-механику спросил
Аноним 26/06/26 Птн 18:02:52 334358572 9
Аноним 26/06/26 Птн 18:02:57 334358574 10
>>334358344 (OP)
бери джуна с российскиэой нейросеткой, не прогадаешь но обосрешься
Аноним 26/06/26 Птн 18:03:03 334358577 11
>>334358484
сам помидором становись, вкатывайся
Аноним 26/06/26 Птн 18:05:42 334358644 12
>>334358577
Я в другой области помидорю
Аноним 26/06/26 Птн 18:06:40 334358667 13
>>334358572
>Сделай мод для портала.
Это плохая идея. Получится мод для портала
Сорс закрыт тем более
Аноним 26/06/26 Птн 18:06:51 334358672 14
Tag: The Power of Paint - прототип второго портала написали несколько студентов в свободное время на своем движке и без нейронок.
Аноним 26/06/26 Птн 18:07:56 334358699 15
Аноним 26/06/26 Птн 18:08:24 334358715 16
>>334358672
>Tag: The Power of Paint - прототип второго портала
Там был прототип первого портала и их сразу взяли в валв. Это не тривиальная задача
Аноним 26/06/26 Птн 18:20:21 334359012 17
>>334358667
Эта как раз хорошая идея.
Аноним 26/06/26 Птн 18:21:12 334359038 18
>>334358344 (OP)
Купи Клод за 20 баксов и он легко это реализует.effort только ставь максимальный
26/06/26 Птн 18:22:25 334359069 19
>>334358344 (OP)
В роблоксе есть клон портала блядь, идеально работающий. TUNELLER. В роблоксе блядь опять же. Может ты ебнутый фанат габена который просто любые порталы не от валв говном поливать будет?
Аноним 26/06/26 Птн 18:23:16 334359090 20
>>334358344 (OP)
Дай нейроке сначала задание создать простой неэвклидовый движок с поддержкой порталов. Потом допиливай. Сходу тебе готовое не одна нейронка не сделает
Аноним # OP 26/06/26 Птн 18:24:26 334359127 21
>>334359038
Я вроде ясно написал, что не могут они
Аноним 26/06/26 Птн 18:27:04 334359191 22
Аноним 26/06/26 Птн 18:33:08 334359357 23
А зачем тебе? Как ты без навыков программирования собрался делать фулл игру? Даже если чел был бы, то по итогу сделал игру он, а не ты. Он близким человеком быть должен.

А про механику порталов это вообще пиздец. Это тяжело было программировать и работает оно на костылях.
Аноним # OP 26/06/26 Птн 18:51:34 334359851 24
>>334359191
Попросил сделать поэтапный план и выполнить первый этап. На нем уже фейл. Он даже не смог через с++ рендер текстуру на шейп «портала» натянуть правильно (по этому простому пункту есть туторы на ютуба даже как раз под задачу портала)
Аноним # OP 26/06/26 Птн 18:53:03 334359887 25
>>334359357
>Как ты без навыков программирования собрался делать фулл игру?
У меня есть навыки. Экспедицию 33 видел? Сделана на блюпринтах (нодовый кодерский редактор в анриле)
Аноним 26/06/26 Птн 19:00:52 334360115 26
>>334358344 (OP)
Для портал нахуй не нужен спец движок брать универсальный, все что в игре сложного будет писать - все равно писать самому, так что проще библиотек нужных взять и слепить самому все
Аноним 26/06/26 Птн 19:04:14 334360221 27
>>334358344 (OP)
АНОНЧИК СКАЖИ ВОТ Я НИЧЕГО НЕ УМЕЮ НО ХОЧУ ЧТОБЫ ЕТА МИЛЛИОН РУБЛЕЙ В МЕСЯЦ СКАЖИ ЧЕ ДЕЛАТЬ НАДО ТО
Аноним 26/06/26 Птн 19:06:30 334360281 28
>>334358452
А сколько тебе лет? Завидую что ты смог. Как это получилось???
Аноним # OP 26/06/26 Птн 19:10:35 334360383 29
>>334360221
Не понял тебя. Спросил про цену

>>334360115
>Для портал нахуй не нужен спец движок брать универсальный
Мне надо уе потому что дальше я сам смогу в нем хуевертить. Только кор-механику надо реализовать
Аноним # OP 26/06/26 Птн 19:13:04 334360441 30
Бросилось в глаза: все предлагают нейронки, но никто не предлагает свои услуги вооружившись нейронками. То есть даже они понимают, что ИИ не тащит тут
Аноним 26/06/26 Птн 19:15:59 334360525 31
>>334360383
держи ебень

Portal.h

// Copyright. Portal core mechanic for UE5.
#pragma once

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

class UStaticMeshComponent;
class UBoxComponent;
class USceneComponent;
class USceneCaptureComponent2D;
class UTextureRenderTarget2D;
class UMaterialInterface;
class UMaterialInstanceDynamic;

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPortalTeleport, AActor, TeleportedActor);

/
A single portal surface. Two portals are linked together via LinkTo().

Responsibilities:
- Render what is visible "through" the portal using a SceneCapture2D + render target.
- Detect when an actor crosses the portal plane and teleport it to the linked portal,
preserving relative position, orientation and velocity (momentum).

Convention: the portal's local +X (actor forward) is the surface normal, pointing OUT
of the wall toward the player. The teleport math is a 180 deg rotation about the portal's
up axis, which is the standard Portal-style mapping.
/
UCLASS()
class PORTALCORE_API APortal : public AActor
{
GENERATED_BODY()

public:
APortal();

virtual void BeginPlay() override;
virtual void Tick(float DeltaSeconds) override;

/
Link this portal and Other together (both directions). /
UFUNCTION(BlueprintCallable, Category = "Portal")
void LinkTo(APortal
Other);

/ Reposition the portal onto a surface (used by the portal gun). /
UFUNCTION(BlueprintCallable, Category = "Portal")
void PlaceAt(const FVector& Location, const FRotator& Rotation);

/
The other end of this portal pair. /
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portal")
TObjectPtr<APortal> LinkedPortal;

/ Material that samples a render-target parameter named "PortalTexture" with screen UVs. /
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portal")
TObjectPtr<UMaterialInterface> PortalMaterial;

/
Fired after any actor is teleported by this portal (hook for VFX / SFX). /
UPROPERTY(BlueprintAssignable, Category = "Portal")
FOnPortalTeleport OnTeleported;

// --- Teleport math (also reused to place the scene-capture camera) -------------------

/ Map a transform from Source portal frame into Target portal frame. /
static FTransform ConvertTransform(const APortal
Source, const APortal Target, const FTransform& In);
/
Map a rotation from Source portal frame into Target portal frame. /
static FQuat ConvertQuat(const APortal Source, const APortal Target, const FQuat& In);
/ Map a direction/velocity from Source portal frame into Target portal frame. /
static FVector ConvertVector(const APortal
Source, const APortal* Target, const FVector& In);

protected:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Portal")
TObjectPtr<USceneComponent> PortalRoot;

/
Flat quad the player sees; orient its visible face along actor +X. */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Portal")
TObjectPtr<UStaticMeshComponent> PortalMesh;

/ Overlap volume straddling the portal plane; gates which actors we test for crossing. */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Portal")
TObjectPtr<UBoxComponent> TeleportTrigger;

/
Renders the linked portal's view into RenderTarget. */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Portal")
TObjectPtr<USceneCaptureComponent2D> SceneCapture;

private:
void UpdateRenderTarget();
void UpdateSceneCapture();
void HandleTeleports();
void TeleportActor(AActor* Actor);

/ True if the segment Start->End passed through the front face of the portal plane. */
bool CrossedPlane(const FVector& Start, const FVector& End) const;

UFUNCTION()
void OnTriggerBeginOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& Sweep);
UFUNCTION()
void OnTriggerEndOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);

UPROPERTY(Transient)
TObjectPtr<UTextureRenderTarget2D> RenderTarget;

UPROPERTY(Transient)
TObjectPtr<UMaterialInstanceDynamic> PortalMID;

/
Actors currently inside the trigger; tested for plane crossing each frame. */
UPROPERTY(Transient)
TSet<TObjectPtr<AActor>> TrackedActors;

/** Last-frame location per tracked actor, for crossing detection. */
TMap<TWeakObjectPtr<AActor>, FVector> LastLocations;

FIntPoint LastViewportSize = FIntPoint::ZeroValue;
};
Аноним 26/06/26 Птн 19:16:19 334360535 32
>>334360525

Portal.cpp

// Copyright. Portal core mechanic for UE5.
#include "Portal.h"

#include "Components/StaticMeshComponent.h"
#include "Components/BoxComponent.h"
#include "Components/SceneCaptureComponent2D.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Engine/GameViewportClient.h"
#include "Engine/Engine.h"
#include "Kismet/KismetRenderingLibrary.h"
#include "Kismet/GameplayStatics.h"
#include "Materials/MaterialInstanceDynamic.h"
#include "GameFramework/Pawn.h"
#include "GameFramework/Controller.h"
#include "GameFramework/Character.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/PlayerController.h"
#include "Camera/PlayerCameraManager.h"

namespace
{
// 180 degree rotation about the portal up axis: the heart of the Portal mapping.
// A point/velocity that goes INTO one portal comes OUT of the other, mirrored.
static const FQuat PortalFlip = FQuat(FVector::UpVector, PI);
}

APortal::APortal()
{
PrimaryActorTick.bCanEverTick = true;
// Tick late so the player's camera for this frame is already up to date before we
// position the scene-capture relative to it.
PrimaryActorTick.TickGroup = TG_PostUpdateWork;

PortalRoot = CreateDefaultSubobject<USceneComponent>(TEXT("PortalRoot"));
SetRootComponent(PortalRoot);

PortalMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PortalMesh"));
PortalMesh->SetupAttachment(PortalRoot);
// The player must be able to walk straight through the surface.
PortalMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
PortalMesh->SetCastShadow(false);

TeleportTrigger = CreateDefaultSubobject<UBoxComponent>(TEXT("TeleportTrigger"));
TeleportTrigger->SetupAttachment(PortalRoot);
// Thin along the normal (X), spanning the opening in Y/Z. Tune to your portal size.
TeleportTrigger->SetBoxExtent(FVector(40.f, 55.f, 95.f));
TeleportTrigger->SetCollisionProfileName(TEXT("OverlapAllDynamic"));
TeleportTrigger->SetGenerateOverlapEvents(true);

SceneCapture = CreateDefaultSubobject<USceneCaptureComponent2D>(TEXT("SceneCapture"));
SceneCapture->SetupAttachment(PortalRoot);
// We drive the capture manually each frame after positioning it, so don't auto-capture.
SceneCapture->bCaptureEveryFrame = false;
SceneCapture->bCaptureOnMovement = false;
// Final post-processed color so the through-portal view matches the player's view.
SceneCapture->CaptureSource = ESceneCaptureSource::SCS_FinalColorLDR;
SceneCapture->bEnableClipPlane = true;
SceneCapture->bAlwaysPersistRenderingState = true;
}

void APortal::BeginPlay()
{
Super::BeginPlay();

if (PortalMaterial)
{
PortalMID = UMaterialInstanceDynamic::Create(PortalMaterial, this);
PortalMesh->SetMaterial(0, PortalMID);
}

TeleportTrigger->OnComponentBeginOverlap.AddDynamic(this, &APortal::OnTriggerBeginOverlap);
TeleportTrigger->OnComponentEndOverlap.AddDynamic(this, &APortal::OnTriggerEndOverlap);
}

void APortal::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);

if (!LinkedPortal)
{
return; // Nothing to render or teleport into until paired.
}

UpdateRenderTarget();
UpdateSceneCapture();
SceneCapture->CaptureScene();

HandleTeleports();
}

// ---------------------------------------------------------------------------------------
// Linking & placement
// ---------------------------------------------------------------------------------------

void APortal::LinkTo(APortal Other)
{
LinkedPortal = Other;
if (Other)
{
Other->LinkedPortal = this;
}
}

void APortal::PlaceAt(const FVector& Location, const FRotator& Rotation)
{
SetActorLocationAndRotation(Location, Rotation);
SetActorHiddenInGame(false);
SetActorEnableCollision(true);
}

// ---------------------------------------------------------------------------------------
// Rendering the view through the portal
// ---------------------------------------------------------------------------------------

void APortal::UpdateRenderTarget()
{
FVector2D ViewportSize = FVector2D::ZeroVector;
if (GEngine && GEngine->GameViewport)
{
GEngine->GameViewport->GetViewportSize(ViewportSize);
}

const FIntPoint Size(FMath::Max(1, (int32)ViewportSize.X), FMath::Max(1, (int32)ViewportSize.Y));
if (Size == FIntPoint(1, 1))
{
return; // Viewport not ready yet.
}

if (!RenderTarget)
{
RenderTarget = UKismetRenderingLibrary::CreateRenderTarget2D(this, Size.X, Size.Y, RTF_RGBA16f);
SceneCapture->TextureTarget = RenderTarget;
if (PortalMID)
{
PortalMID->SetTextureParameterValue(TEXT("PortalTexture"), RenderTarget);
}
LastViewportSize = Size;
}
else if (Size != LastViewportSize)
{
// Keep the render target matched to the screen so the screen-UV sampling stays 1:1.
RenderTarget->ResizeTarget(Size.X, Size.Y);
LastViewportSize = Size;
}
}

void APortal::UpdateSceneCapture()
{
const APlayerController
PC = UGameplayStatics::GetPlayerController(this, 0);
if (!PC || !PC->PlayerCameraManager)
{
return;
}

// Place the capture where the player's eye maps to on the LINKED portal. Looking at THIS
// portal then shows the world as seen "out of" the linked portal.
const FTransform CameraXf(PC->PlayerCameraManager->GetCameraRotation(),
PC->PlayerCameraManager->GetCameraLocation());
const FTransform CaptureXf = ConvertTransform(this, LinkedPortal, CameraXf);

SceneCapture->SetWorldLocationAndRotation(CaptureXf.GetLocation(), CaptureXf.GetRotation());
SceneCapture->FOVAngle = PC->PlayerCameraManager->GetFOVAngle();

// Clip everything behind the linked portal so the wall it is mounted on never occludes
// the view (the capture sits behind that surface looking out through the opening).
SceneCapture->ClipPlaneBase = LinkedPortal->GetActorLocation();
SceneCapture->ClipPlaneNormal = LinkedPortal->GetActorForwardVector();

// Single-bounce: never let a capture see the portal surfaces themselves (avoids feedback).
SceneCapture->HiddenActors.Reset();
SceneCapture->HiddenActors.Add(const_cast<APortal>(this));
SceneCapture->HiddenActors.Add(LinkedPortal);
}

// ---------------------------------------------------------------------------------------
// Teleportation
// ---------------------------------------------------------------------------------------

void APortal::HandleTeleports()
{
for (auto It = TrackedActors.CreateIterator(); It; ++It)
{
AActor
Actor = It;
if (!IsValid(Actor))
{
It.RemoveCurrent();
continue;
}

const FVector Curr = Actor->GetActorLocation();
if (const FVector
Prev = LastLocations.Find(Actor))
{
if (CrossedPlane(Prev, Curr))
{
TeleportActor(Actor);
continue; // TeleportActor refreshes bookkeeping.
}
}
LastLocations.Add(Actor, Curr);
}
}

bool APortal::CrossedPlane(const FVector& Start, const FVector& End) const
{
const FVector Fwd = GetActorForwardVector();
const FVector Loc = GetActorLocation();
const float DistStart = FVector::DotProduct(Start - Loc, Fwd);
const float DistEnd = FVector::DotProduct(End - Loc, Fwd);
// Front (positive) to back (non-positive) means the actor entered the portal this frame.
return DistStart > 0.f && DistEnd <= 0.f;
}

void APortal::TeleportActor(AActor
Actor)
{
if (!LinkedPortal || !IsValid(Actor))
{
return;
}

const FTransform NewXf = ConvertTransform(this, LinkedPortal, Actor->GetActorTransform());
Actor->SetActorLocationAndRotation(NewXf.GetLocation(), NewXf.GetRotation(),
/bSweep/ false, nullptr, ETeleportType::TeleportPhysics);

// Rotate the player's view so the camera comes out facing the right way.
if (APawn Pawn = Cast<APawn>(Actor))
{
if (AController
Ctrl = Pawn->GetController())
{
const FQuat NewControl = ConvertQuat(this, LinkedPortal, FQuat(Ctrl->GetControlRotation()));
Ctrl->SetControlRotation(NewControl.Rotator());
}
}

// Preserve momentum: "speedy thing goes in, speedy thing comes out."
const FVector NewVel = ConvertVector(this, LinkedPortal, Actor->GetVelocity());
if (ACharacter Char = Cast<ACharacter>(Actor))
{
Char->GetCharacterMovement()->Velocity = NewVel;
}
else if (UPrimitiveComponent
Prim = Cast<UPrimitiveComponent>(Actor->GetRootComponent()))
{
if (Prim->IsSimulatingPhysics())
{
Prim->SetPhysicsLinearVelocity(NewVel);
}
}

// Stop THIS portal from re-processing the actor, and prime the linked portal so it
// doesn't immediately teleport the actor straight back.
LastLocations.Remove(Actor);
TrackedActors.Remove(Actor);
LinkedPortal->TrackedActors.Add(Actor);
LinkedPortal->LastLocations.Add(Actor, Actor->GetActorLocation());

OnTeleported.Broadcast(Actor);
}

// ---------------------------------------------------------------------------------------
// Overlap tracking
// ---------------------------------------------------------------------------------------

void APortal::OnTriggerBeginOverlap(UPrimitiveComponent, AActor OtherActor,
UPrimitiveComponent, int32, bool, const FHitResult&)
{
if (OtherActor && OtherActor != this && OtherActor != LinkedPortal)
{
TrackedActors.Add(OtherActor);
LastLocations.Add(OtherActor, OtherActor->GetActorLocation());
}
}

void APortal::OnTriggerEndOverlap(UPrimitiveComponent
, AActor OtherActor,
UPrimitiveComponent
, int32)
{
if (OtherActor)
{
TrackedActors.Remove(OtherActor);
LastLocations.Remove(OtherActor);
}
}

// ---------------------------------------------------------------------------------------
// Static mapping helpers (this portal frame -> linked portal frame, with 180 deg flip)
// ---------------------------------------------------------------------------------------

FTransform APortal::ConvertTransform(const APortal Source, const APortal Target, const FTransform& In)
{
const FVector SLoc = Source->GetActorLocation();
const FQuat SRot = Source->GetActorQuat();
const FVector TLoc = Target->GetActorLocation();
const FQuat TRot = Target->GetActorQuat();

// Position: express In relative to Source, flip 180 about up, re-express relative to Target.
FVector Local = SRot.UnrotateVector(In.GetLocation() - SLoc);
Local = PortalFlip.RotateVector(Local);
const FVector NewLoc = TLoc + TRot.RotateVector(Local);

// Rotation: same idea in quaternion form.
FQuat LocalRot = SRot.Inverse() In.GetRotation();
LocalRot = PortalFlip
LocalRot;
const FQuat NewRot = TRot LocalRot;

return FTransform(NewRot, NewLoc, In.GetScale3D());
}

FQuat APortal::ConvertQuat(const APortal
Source, const APortal Target, const FQuat& In)
{
FQuat Local = Source->GetActorQuat().Inverse()
In;
Local = PortalFlip Local;
return Target->GetActorQuat()
Local;
}

FVector APortal::ConvertVector(const APortal Source, const APortal Target, const FVector& In)
{
FVector Local = Source->GetActorQuat().UnrotateVector(In);
Local = PortalFlip.RotateVector(Local);
return Target->GetActorQuat().RotateVector(Local);
}
Аноним 26/06/26 Птн 19:16:44 334360551 33
>>334360535

PortalGunComponent.h

// Copyright. Portal core mechanic for UE5.
#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "PortalGunComponent.generated.h"

class APortal;

/
Drop this onto any Pawn/Character. FirePortal traces from the view point and places the
blue (primary) or orange (secondary) portal on whatever surface it hits, then links the
pair once both exist.
/
UCLASS(ClassGroup = (Portal), meta = (BlueprintSpawnableComponent))
class PORTALCORE_API UPortalGunComponent : public UActorComponent
{
GENERATED_BODY()

public:
UPortalGunComponent();

/
Portal actor class to spawn. Assign a Blueprint child of APortal (mesh + material set). /
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portal Gun")
TSubclassOf<APortal> PortalClass;

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portal Gun")
float TraceDistance = 10000.f;

/ Trace channel used to find portalable surfaces.
/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portal Gun")
TEnumAsByte<ECollisionChannel> TraceChannel = ECC_Visibility;

/
Fire a portal. bPrimary == true spawns/moves the blue portal, false the orange one. /
UFUNCTION(BlueprintCallable, Category = "Portal Gun")
void FirePortal(bool bPrimary);

protected:
UPROPERTY(Transient, BlueprintReadOnly, Category = "Portal Gun")
TObjectPtr<APortal> PrimaryPortal;

UPROPERTY(Transient, BlueprintReadOnly, Category = "Portal Gun")
TObjectPtr<APortal> SecondaryPortal;

private:
bool GetViewPoint(FVector& OutLocation, FRotator& OutRotation) const;

/
Build a portal rotation whose forward (+X) is the surface normal. /
static FRotator MakePortalRotation(const FVector& SurfaceNormal);
};
Аноним 26/06/26 Птн 19:17:09 334360565 34
>>334360551
PortalGunComponent.cpp

// Copyright. Portal core mechanic for UE5.
#include "PortalGunComponent.h"

#include "Portal.h"
#include "GameFramework/Pawn.h"
#include "GameFramework/Controller.h"
#include "Engine/World.h"
#include "CollisionQueryParams.h"

UPortalGunComponent::UPortalGunComponent()
{
PrimaryComponentTick.bCanEverTick = false;
}

void UPortalGunComponent::FirePortal(bool bPrimary)
{
if (!PortalClass)
{
return;
}

FVector ViewLoc;
FRotator ViewRot;
if (!GetViewPoint(ViewLoc, ViewRot))
{
return;
}

const FVector Start = ViewLoc;
const FVector End = Start + ViewRot.Vector()
TraceDistance;

FCollisionQueryParams Params(SCENE_QUERY_STAT(FirePortal), /bTraceComplex/ true);
Params.AddIgnoredActor(GetOwner());
if (PrimaryPortal) { Params.AddIgnoredActor(PrimaryPortal); }
if (SecondaryPortal) { Params.AddIgnoredActor(SecondaryPortal); }

FHitResult Hit;
if (!GetWorld()->LineTraceSingleByChannel(Hit, Start, End, TraceChannel, Params))
{
return; // Missed every surface.
}

const FRotator PortalRot = MakePortalRotation(Hit.ImpactNormal);
// Nudge off the wall so the surface does not z-fight or clip the portal plane.
const FVector PortalLoc = Hit.ImpactPoint + Hit.ImpactNormal 1.0f;

TObjectPtr<APortal>& Slot = bPrimary ? PrimaryPortal : SecondaryPortal;
if (!Slot)
{
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = GetOwner();
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
Slot = GetWorld()->SpawnActor<APortal>(PortalClass, PortalLoc, PortalRot, SpawnParams);
}
else
{
Slot->PlaceAt(PortalLoc, PortalRot);
}

if (PrimaryPortal && SecondaryPortal)
{
PrimaryPortal->LinkTo(SecondaryPortal);
}
}

bool UPortalGunComponent::GetViewPoint(FVector& OutLocation, FRotator& OutRotation) const
{
if (const APawn
Pawn = Cast<APawn>(GetOwner()))
{
if (AController Controller = Pawn->GetController())
{
// Uses the active camera view point (eyes), not the pawn pivot.
Controller->GetPlayerViewPoint(OutLocation, OutRotation);
return true;
}
}

if (const AActor
Owner = GetOwner())
{
OutLocation = Owner->GetActorLocation();
OutRotation = Owner->GetActorRotation();
return true;
}
return false;
}

FRotator UPortalGunComponent::MakePortalRotation(const FVector& SurfaceNormal)
{
// Choose an up reference that is not parallel to the normal (handles floor/ceiling).
const FVector Up = FMath::Abs(FVector::DotProduct(SurfaceNormal, FVector::UpVector)) > 0.95f
? FVector::ForwardVector
: FVector::UpVector;
const FVector Right = FVector::CrossProduct(Up, SurfaceNormal).GetSafeNormal();
const FVector OrthoUp = FVector::CrossProduct(SurfaceNormal, Right).GetSafeNormal();

// Portal forward (+X) = surface normal, +Z = OrthoUp.
return FRotationMatrix::MakeFromXZ(SurfaceNormal, OrthoUp).Rotator();
}
Аноним 26/06/26 Птн 19:18:02 334360580 35
>>334358344 (OP)
Да, нужна команда анальников и бюджет 1 миллион рублей в месяц.
2 кодерка по 200к, и 3-4 художника по 100к.
Аноним 26/06/26 Птн 19:19:12 334360606 36
>>334360565

PortalCharacter.h

// Copyright. Portal core mechanic for UE5.
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "PortalCharacter.generated.h"

class UCameraComponent;
class UPortalGunComponent;

/
Minimal first-person character wired up with a portal gun. Use this directly, or just copy
the UPortalGunComponent onto your own character. Input is bound with the legacy input system
so it works without extra assets; swap to Enhanced Input if you prefer (see README).
/
UCLASS()
class PORTALCORE_API APortalCharacter : public ACharacter
{
GENERATED_BODY()

public:
APortalCharacter();

protected:
virtual void SetupPlayerInputComponent(UInputComponent PlayerInputComponent) override;

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Portal")
TObjectPtr<UCameraComponent> Camera;

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Portal")
TObjectPtr<UPortalGunComponent> PortalGun;

private:
void MoveForward(float Value);
void MoveRight(float Value);
void FirePrimary();
void FireSecondary();
};


---

PortalCharacter.cpp

// Copyright. Portal core mechanic for UE5.
#include "PortalCharacter.h"

#include "PortalGunComponent.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "GameFramework/CharacterMovementComponent.h"

APortalCharacter::APortalCharacter()
{
PrimaryActorTick.bCanEverTick = false;

Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
Camera->SetupAttachment(GetCapsuleComponent());
Camera->SetRelativeLocation(FVector(0.f, 0.f, 64.f)); // eye height
Camera->bUsePawnControlRotation = true;

PortalGun = CreateDefaultSubobject<UPortalGunComponent>(TEXT("PortalGun"));

// Let the controller drive look; the body yaw follows movement input.
bUseControllerRotationPitch = false;
bUseControllerRotationYaw = true;
bUseControllerRotationRoll = false;
}

void APortalCharacter::SetupPlayerInputComponent(UInputComponent
PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);

// Legacy bindings — add matching Axis/Action mappings in Project Settings > Input,
// or rebind these to Enhanced Input actions.
PlayerInputComponent->BindAxis("MoveForward", this, &APortalCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &APortalCharacter::MoveRight);
PlayerInputComponent->BindAxis("Turn", this, &APortalCharacter::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &APortalCharacter::AddControllerPitchInput);

PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);
PlayerInputComponent->BindAction("FirePortalA", IE_Pressed, this, &APortalCharacter::FirePrimary);
PlayerInputComponent->BindAction("FirePortalB", IE_Pressed, this, &APortalCharacter::FireSecondary);
}

void APortalCharacter::MoveForward(float Value)
{
if (Value != 0.f)
{
AddMovementInput(GetActorForwardVector(), Value);
}
}

void APortalCharacter::MoveRight(float Value)
{
if (Value != 0.f)
{
AddMovementInput(GetActorRightVector(), Value);
}
}

void APortalCharacter::FirePrimary()
{
if (PortalGun)
{
PortalGun->FirePortal(/bPrimary/ true);
}
}

void APortalCharacter::FireSecondary()
{
if (PortalGun)
{
PortalGun->FirePortal(/bPrimary/ false);
}
}


----

PortalCore.Build.cs

// Copyright. Portal core mechanic for UE5.
using UnrealBuildTool;

public class PortalCore : ModuleRules
{
public PortalCore(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

PublicDependencyModuleNames.AddRange(new string[]
{
"Core",
"CoreUObject",
"Engine",
"InputCore",
});

// If you migrate the character to Enhanced Input, also add:
// PrivateDependencyModuleNames.AddRange(new string[] { "EnhancedInput" });
}
}


------

PortalCore.h

// Copyright. Portal core mechanic for UE5.
#pragma once

#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"


----

PortalCore.cpp

// Copyright. Portal core mechanic for UE5.
#include "PortalCore.h"

IMPLEMENT_MODULE(FDefaultGameModuleImpl, PortalCore);


-----

Readme.md

# PortalCore — Portal-style core mechanic for UE5 (C++)

Ядро как в Portal: портальная пушка, размещение порталов на поверхностях,
бесшовная телепортация с сохранением импульса и рендер вида «сквозь» портал
через `SceneCapture2D`.

Проверялось на логике UE 5.3–5.5. API порталов от версии движка не зависит.

## Что внутри

| Файл | Роль |
|------|------|
| `Portal.h/.cpp` | Один портал: рендер вида сквозь себя + телепортация пересёкших плоскость акторов. Статические хелперы `ConvertTransform/Quat/Vector` — вся матимея отображения «портал A → портал B» (поворот на 180° вокруг оси Up). |
| `PortalGunComponent.h/.cpp` | Компонент-пушка. `FirePortal(true/false)` трейсит из точки взгляда и ставит синий/оранжевый портал, линкует пару. |
| `PortalCharacter.h/.cpp` | Минимальный FPS-персонаж с камерой и пушкой (опционально — можно вешать компонент на свой `Character`). |

## Установка

### Вариант A — отдельный модуль
1. Скопируй папку `Source/PortalCore` в `Source/` своего проекта.
2. В `<Project>.uproject` добавь модуль в массив `Modules`:
```json
{ "Name": "PortalCore", "Type": "Runtime", "LoadingPhase": "Default" }
```
3. В `Source/<Project>Editor.Target.cs` и `<Project>.Target.cs` добавь `"PortalCore"` в `ExtraModuleNames`.
4. Regenerate project files → Build.

### Вариант B — без нового модуля (проще)
Просто положи `Portal.*`, `PortalGunComponent.*`, `PortalCharacter.*` в `Source/<ТвойМодуль>/`,
замени макрос `PORTALCORE_API` на `<ТВОЙМОДУЛЬ>_API`, и добавь в свой `*.Build.cs`
зависимости: `Core, CoreUObject, Engine, InputCore`. Файлы `PortalCore.Build.cs`,
`PortalCore.h/.cpp` тогда не нужны.

## Обязательный шаг: материал портала

Рендер сквозь портал работает так: `SceneCapture` пишет вид в render target, а материал
на меше портала
сэмплит этот таргет по экранным UV — получается «окно».

Создай Material `M_Portal`:
-
Blend Mode: Opaque, Shading Model: Unlit, Two Sided:
- Нода `ScreenPosition` → её UV-выход → в `UV` ноды `TextureSampleParameter2D`
- Параметр текстуры назови ровно
`PortalTexture` (код пишет в этот параметр)
- Выход текстуры →
Emissive Color

Материал назначь в свойстве `PortalMaterial` у портала (или в его Blueprint-наследнике).

## Сборка сцены

1. Сделай Blueprint-наследника `APortal` (`BP_Portal`):
- назначь плоский меш (плоскость/quad) так, чтобы
видимая грань смотрела вдоль +X актора
(у стандартного `Plane` нормаль вдоль +Z — поверни меш на Pitch +90°);
- отмасштабируй под проём (примерно 90×180 см) и подгони `TeleportTrigger` (`BoxExtent`);
- выстави `PortalMaterial = M_Portal`.
2. Персонаж:
- либо используй `APortalCharacter` как Default Pawn,
- либо добавь `UPortalGunComponent` на свой Character и задай у него `PortalClass = BP_Portal`.
3. Input (Project Settings → Input), для `APortalCharacter`:
- Axis: `MoveForward`, `MoveRight`, `Turn`, `LookUp`
- Action: `Jump`, `FirePortalA` (ЛКМ), `FirePortalB` (ПКМ)
- На Enhanced Input — просто вызывай `PortalGun->FirePortal(true/false)` из своих
`InputAction`-хендлеров.

Готово: стреляй двумя порталами по стенам/полу/потолку и проходи сквозь них.
Импульс сохраняется — можно делишь «fling» с высоты.

## Как работает матмодель (коротко)

Отображение из системы координат портала-источника в систему портала-приёмника — это
поворот на
180° вокруг оси Up портала. Одна и та же формула (`ConvertTransform`):
- для
игрока в момент пересечения плоскости даёт корректный выход из второго портала;
- для
камеры захвата ставит её «за» вторым порталом — ровно туда, откуда надо снимать
вид, видимый сквозь первый. `ClipPlane` на приёмнике убирает стену за ним из кадра.

Телепорт срабатывает по
пересечению плоскости (а не на overlap): каждый кадр для
акторов в триггере проверяется смена знака `dot(actor - portal, forward)` с «+» на «−».
Скорость поворачивается тем же отображением → «speedy thing goes in, speedy thing comes out».

## Сознательные упрощения (можно расширить)

-
Один «отскок» рендера. Порталы, смотрящие друг в друга, не дают бесконечный
туннель — для этого нужен рекурсивный рендер в несколько проходов.
-
Нет клона-двойника на стыке: в момент перехода тело не торчит из второго портала
половиной модели. Лечится дублирующим мешем + clip plane на персонаже.
-
Поворот вида** берёт yaw/pitch из контрол-ротатора; для порталов на полу/потолке всё
работает, но «заваливание» горизонта при нестандартных осях не докручено.
- `SceneCapture` с `FinalColorLDR` каждый кадр — самый дорогой кусок. На каждый видимый
портал — отдельный проход рендера. Прячь капчур, когда портал не в кадре, при оптимизации.
Аноним 26/06/26 Птн 19:20:20 334360636 37
image 39Кб, 704x384
704x384
Аноним 26/06/26 Птн 19:20:44 334360650 38
>>334360606
фикс

// Snapshot first: TeleportActor mutates TrackedActors/LastLocations as it hands the actor
// over to the linked portal, so we must not iterate the live set.
TArray<TObjectPtr<AActor>> Snapshot = TrackedActors.Array();
for (AActor Actor : Snapshot)
{
if (!IsValid(Actor))
{
TrackedActors.Remove(Actor);
LastLocations.Remove(Actor);
continue;
}

const FVector Curr = Actor->GetActorLocation();
if (const FVector
Prev = LastLocations.Find(Actor))
{
if (CrossedPlane(Prev, Curr))
{
TeleportActor(Actor);
continue; // TeleportActor refreshes bookkeeping.
}
}
LastLocations.Add(Actor, Curr);
}
>>334360606

Готово. Собрал самодостаточный модуль PortalCore — ядро порталов как в Portal.

Что реализовано
Портальная пушка — PortalGunComponent.cpp: трейс из точки взгляда, постановка синего/оранжевого портала на стену/пол/потолок по нормали поверхности, авто-линковка пары.
Бесшовная телепортация — Portal.cpp: срабатывает по пересечению плоскости портала (а не на overlap), переносит игрока и физические объекты, поворачивает вид и сохраняет импульс («speedy thing goes in, speedy thing comes out»).
Рендер сквозь портал — SceneCapture2D → render target по размеру экрана, материал сэмплит по экранным UV → эффект «окна». Есть ClipPlane, чтобы стена за приёмником не лезла в кадр.
FPS-персонаж — PortalCharacter.cpp с камерой и пушкой (или просто вешаешь компонент на свой Character).
Ядро матмодели
Вся «магия» в трёх статиках Convert
в Portal.h — отображение «портал A → портал B» это поворот на 180° вокруг оси Up. Одна формула обслуживает и телепорт игрока, и позиционирование камеры захвата (ставит её за вторым порталом — ровно откуда снимать вид).

Один обязательный шаг руками
Код не отрендерит портал без материала. В редакторе сделай M_Portal (Unlit, Two-Sided): нода ScreenPosition → в UV у TextureSampleParameter2D с параметром PortalTexture → в Emissive. Назначь его в PortalMaterial. Полная пошаговая настройка (модуль, BP_Portal, input) — в README.md.

Сознательные упрощения
Один «отскок» рендера (нет бесконечного туннеля при порталах друг напротив друга), нет клона-двойника на стыке перехода, поворот вида берёт yaw/pitch. Всё помечено в README в разделе «расширить».
Аноним 26/06/26 Птн 19:21:46 334360676 39
>>334360441
с тебя 200к рублей, хуесос.
Аноним 26/06/26 Птн 19:23:15 334360724 40
>>334360636
Нейрокал - эти нейрокал, даже оп не может игру сделоть, а нейронка нос от хера отличает только с пятого захода. Пффф
Аноним 26/06/26 Птн 19:26:20 334360825 41
>>334360724
Просто он делит картинку на квадратики и воспринимает каждый как 1 токен. Чем больше квадратиков тем лучше результат распознавания изображения. Гоям разрешают делать условные 8х8 тогда как корпорации могут делать хоть 1000х1000 по своей еврейской подписке.
Соответственно одна и та же модель в руках гоев и в руках корпораций выдает абсолютно разный результат.
Аноним 26/06/26 Птн 19:30:27 334360914 42
>>334360825
>как корпорации могут делать хоть 1000х1000 по своей еврейской подписке
У тебя инторнет скоро по подписке в 60$ за Гб, а ты тут про пиксели затираешь. Или ты с Ихгаиля? Тогда, ладн, чо
Аноним 26/06/26 Птн 19:31:05 334360930 43
>>334360825
Тогда закономерный вопрос, как стать не гоем?
Аноним 26/06/26 Птн 19:33:51 334360993 44
>>334360930
Основать корпорацию.
Собрать капитал.
Обучать модели уровня гпт 5.5 и зарабатывать предоставляя к ним доступ.
Аноним 26/06/26 Птн 19:35:02 334361023 45
>>334360993
Что-то на анальничьем...
Аноним 26/06/26 Птн 19:42:06 334361172 46
>>334358344 (OP)
Когда-то я думал, что не могу сбацать игру мечты только из-за бедности и невозможности нанять команду прогеров. Теперь за месяц навайбкодил прототип, и мне открылась страшная правда - между разрозненными светлыми идеями и полноценным диздоком ебучая пропасть. Выкинул на свалку 10 итераций прокачки, три разновидности гибели и пять концептов глобальных спеллов, до сих пор трясусь от гексагональной сетки и чрезмерной свободы, выдаваемой игроку.
Аноним 26/06/26 Птн 19:44:20 334361237 47
>>334358344 (OP)
В чем смысл если такая игра уже есть и 99% работы сделано за тебя? Делай глобальный мод на портал, многие разрабы как раз с модов и начинают.
Аноним 26/06/26 Птн 19:46:08 334361288 48
>>334360383
> Мне надо уе потому что дальше я сам смогу в нем хуевертить. Только кор-механику надо реализовать
чел что-то я тебе нихуя не верю, если бы ты реально мог в этой сфере, то у тебя бы и вопросов не было и получал бы ты столько, что ты без проблем нанял бы уже людей из нашей сферы за часть своей зп
Аноним # OP 26/06/26 Птн 19:56:55 334361576 49
Аноним # OP 26/06/26 Птн 19:59:41 334361656 50
>>334361172
Вопрос в амбициях. Кто-то рубит бабки на симуляторе кокоса

>>334361237
В чем смысл делать соника, есть есть марио
Аноним 26/06/26 Птн 20:07:48 334361854 51
>>334358344 (OP)
>Анальник-наносек, вот скажи мне
>Мне для этого надо нанять анальника-сеньора
В среднем понадобится дохуя средних сеньоров, штук 10.

Но таких кадров, как в Valve, которые сделали это - почти нет. Ты можешь расчитывать на забагованную копию оригинала. И зависит от уровня и производительности твоих тимлидов

>Предположим UE
Выбор, лучше многих
>В меньшей степени склоняюсь к Юнити.
Физика говно там и получится говно у тебя. Под капотом потешные шарпы наркоманские

Source хорош именно физикой, тем что там Portal играется хорошо, смекаешь? Игра на физику, физический движок

>Всю остальную лабуду с кнопками и постами я и сам смогу на блюпринтах.
Ну тут ты разбежался, реально, у твоих 10 сеньоров это может занять лет 20. А может и год. Никто не знает, кого наймёшь
Аноним 26/06/26 Птн 20:10:33 334361911 52
>>334361854
>Сколько такое стоит под ключ?

Забыл, до пизды. Просто дохера. Нереально много. И нужны штучные спецы. Расчехляй десятки миллионов долларов минимум, львиная доля которых уйдёт на поиск спецов.

Просто до пизды сколько это стоить будет, бро, очень дохуя. Я надеюсь ты не наркоман и осознаёшь это

И да, в твоей стране может таких спецов и не быть, не важно, сколько ты всрёшь на их поиск. Цена разработки в зависимости от локации может меняться нна порядки
Аноним 26/06/26 Птн 20:11:33 334361934 53
>>334360636
>Зачем ты вырезал мне мочевой пузырь? Тебе надо было удалить гланды!1111
>@
>Вы правы - нет, это не нос. Я ошибся.
Аноним 26/06/26 Птн 20:15:56 334362052 54
>>334361656
>Кто-то рубит бабки на симуляторе кокоса

Вы все постоянно забываете главное, вероятность создать такое случайно - меньше вероятности попасть в авиакатастрофу.

Скажи мне, ты дохуя часто попадаешь в авикатастрофу? Наберётся у тебя хотя бы десяток пережитых авиакатастроф? Ответ нет, забудь этот концепт вообще
Аноним 26/06/26 Птн 20:17:50 334362098 55
>>334362052
Оп, не пытаюсь тебя демотивиррыать, не подумай. Рациональнее тебе бабок подкопить, потом создать

Людей с десятками лямов долларов несоизмеримо больше людей, создающих симулятор кокоса
Аноним # OP 26/06/26 Птн 20:34:04 334362477 56
>>334361854
>В среднем понадобится дохуя средних сеньоров, штук 10.
В валв один человек это спроектировал всё и даже рассказал как потом на стримах

Прям 10 человек надо? А что там параллелить?

>>334361854
>Source хорош именно физикой, тем что там Portal играется хорошо, смекаешь? Игра на физику, физический движок
в Портал и даже во втором не юзается физика почти. В хл2 примеров интереснее больше с ней
Аноним # OP 26/06/26 Птн 20:40:22 334362643 57
>>334362052
>Вы все постоянно забываете главное, вероятность создать такое случайно - меньше вероятности попасть в авиакатастрофу.
Я о том, что кто-то делает игры, пока другие мечтают

Поэтому я поставил вопрос ребром. Чатгпт сказал, что хватит одного помидора и 5-15к баксов ему
Аноним 26/06/26 Птн 21:07:04 334363309 58
>>334362477
>В валв один человек это спроектировал всё и даже рассказал как потом на стримах.
Читай внимательно состав команды в 50 человек в титрах, а не высказывание воннаби-тимлид макаки, которую вот-вот уволят. Нет там главного разраба, а одарённому, если он есть, уж точно нет никакого резона искать хайпа и пиариться. Все знают - кто он, и так.

>Прям 10 человек надо? А что там параллелить?
И не абы каких, а лучших. Если хочешь такой же популярный продукт сделать. Это самый-самый минимум.

>в Портал и даже во втором не юзается физика почти. В хл2 примеров интереснее больше с ней
Она беспрецендентно идеальна, особенно для своего времени, потому и не ощущается. Физически точна и филигранна. Люди замечают только несовершенство в играх, это сами разрабы валв так говорят. Людям просто приятно прыгать в порталы, когда их интуитивное понимание прыжка сходится с реальным видом. И даже 100 раз прыгнуть - всё равно приятно. Просто в движке нет недочётов, багов.

>>334362643
>Поэтому я поставил вопрос ребром.
Ну вот тебе и ответ, накопи кучу лямов. Это гораздо проще, чем сделать очередного "Чёрного лебедя". Вещи просто стреляют, если на маркетинг потрачен миллион долларов.
Аноним 26/06/26 Птн 21:09:31 334363361 59
>>334362477
>А что там параллелить?
Рутину заёбную. Дизайн, моделлинг, геймпей, скрипты, шейдеры, физика, левел дизайн.

Всё это в одиночку займёт лет 100 времени
Аноним # OP 26/06/26 Птн 21:17:47 334363563 60
>>334363309
>50 человек в титрах
Так мне не игра под ключ нужна, а одна механика
Аноним 26/06/26 Птн 21:22:24 334363685 61
>>334363563
Ну хуле, будет механика говна +/-
Тогда опытного тимлида хватит, только портал это не одна механика, а ещё целая куча других моментов, сделанная на высшем уровне для своего времени
Аноним # OP 26/06/26 Птн 21:32:16 334363942 62
>>334363685
>а ещё целая куча других моментов
Например?
Аноним 26/06/26 Птн 21:38:04 334364099 63
>>334361656
>Вопрос в амбициях.
Минималистичная тактика на мобилки. Даже такой простой жанр ПИЗДЕЦ как сложно делать.

А вообще, советую подождать годик-другой, может, ИИ тебе и заменит сеньоров-помидоров. Напомню, пару лет назад инструменты вроде opencode были научной фантастикой.
Аноним 26/06/26 Птн 21:47:04 334364345 64
>>334364099
>Минималистичная тактика на мобилки
хоррор бродилку сделай, а то что ты описываешь запара
Аноним 26/06/26 Птн 21:47:44 334364362 65
>>334358344 (OP)
Нужен широмыслящий математик, который знает анрил, чтобы как портал.
Габеновские порталы такие охуенные потому что габен прекрасно знает своё двигло, втч его недостатки, может его модифицировать и правильно подбирать костыли.
Там сама технология порталов это один гигантский костыль. Я бы сказал даже коляска. С другой стороны их методы вполне выглядят универсальными для других движков. Погугли как делали портал или разбор багов или что-то в таком духе и +- приблизительно поймёшь что и как.
Настоящие порталы ни одного двигло не потянет.
Аноним 26/06/26 Птн 22:07:29 334364904 66
>>334363942
>Например?
Графон, геймплей, сюжет, звуковое сопровождение
Модели, дизайн

Всё сделано очень талантливыми людьми, который крайне сложно найти. Ты может и не увидишь никогда таких людей
Аноним 26/06/26 Птн 22:16:55 334365151 67
>>334364904
С другой стороны, я думаю, половина треда (или даже весь тред) не видели современных Русских фрилансеров, работающих за 10 к. И что они могут сделать за 50
Аноним 26/06/26 Птн 22:36:09 334365628 68
>>334365151
А ты их видел где-то кроме своих влажных фантазий маньки?
Аноним 26/06/26 Птн 22:51:19 334366047 69
>>334364904
>Графон, геймплей, сюжет, звуковое сопровождение
>Модели, дизайн
Так мне не игра под ключ нужна, а одна механика
Аноним 27/06/26 Суб 00:58:25 334369039 70
>>334366047
Да можешь хоть код выше по треду взять и прикрутить, если выйдет, будет у тебя забагованная механика говна с кучей косяков. И не очень популярное поделие
Аноним 27/06/26 Суб 01:06:02 334369196 71
>>334358344 (OP)
Легче сделать мод на сам Portal, освоить хаммер для создания карт и как худ менять тебе нейронка без проблем подскажет.
Аноним 27/06/26 Суб 01:10:49 334369295 72
>>334358344 (OP)
Мне кажется, самое сложное в порталах - это чтобы отображалось корректно, что внутри портала. А если для начала просто сделать оранжевый и синий овалы и соотвесттвенно реализовать телепорт при входе в один, то задача сильно легче. Потом уже разбираться, как сделать корректное отображение. Разве нет?
Аноним 27/06/26 Суб 01:13:50 334369363 73
>>334358344 (OP)
тупые вопросы какие-то. Ну да тебе нужен математик какой-нибудь неплохой и достаточно одного кодера уровня синьор на анриле. Если речь про эту одну механику.

Если тебе полноценную игру делать, то нужно человек 10 будет и год работы.
Аноним 27/06/26 Суб 01:14:23 334369373 74
Оп просто спросил, сколько будет стоить, а отвечают ему про графен, популярность, какие-то автокатастрофы даже. Классика.
Аноним 27/06/26 Суб 01:15:27 334369394 75
>>334369373
Разработка игры уровня портал будет стоит 5-10 лямов баксов.
Аноним 27/06/26 Суб 01:17:49 334369442 76
>>334369394
Нет, не будет, там делать нехуй, если есть много времени. В игре 1 уникальная механика, все остальное в сток ue-бане имеется или докручивается с минимум усилий. Ассет лист тоже не слишком объемный: лаборатория и белые вибраторы с лазерами, иногда лужи - все.
Аноним 27/06/26 Суб 01:19:17 334369468 77
Настройки X
Ответить в тред X
15000
Добавить файл/ctrl-v
Стикеры X
Избранное / Топ тредов