18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

这篇具有很好参考价值的文章主要介绍了18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

打开主角类,生成枪的代码逻辑在游戏开始函数里

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

所以在生成之前,我们需要判断该对象是否在服务器端(服务器端视角)

void ASCharacter::BeginPlay()
{
	Super::BeginPlay();
	DefaultsFOV = CameraComp->FieldOfView;
	//判断是否在服务器端
	if (Role == ROLE_Authority)
	{
		//设置生成参数,当生成的actor碰到了其他物体,也要生成
		FActorSpawnParameters Parameters;
		Parameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
		//生成武器actor(类型、位置、方向、参数),并且其地址赋予到指针上
		CurrentWeapen1 = GetWorld()->SpawnActor<ASWeapen>(StartWeapen, FVector::ZeroVector, FRotator::ZeroRotator, Parameters);
		//设置武器的位置与骨骼的插槽中,并设置主人
		if (CurrentWeapen1)
		{
			CurrentWeapen1->SetOwner(this);
			CurrentWeapen1->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, WeaponAttachSoketName);
		}
	}
	
	//受伤自定义事件绑定
	HealthComp->OnHealthChanged.AddDynamic(this, &ASCharacter::OnHealthChanged);

}

编译一下,看看是什么效果

我们发现,左边的有武器,右边的没有武器

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】 所以我们要让武器可以进行网络复制

打开武器类,在构造函数中进行设置

	//设置可以进行网络复制
	SetReplicates(true);

编译,然后打开枪的蓝图,打上勾

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

这一次他们都有枪了

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】 18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

 现在枪虽然是有了,左边的玩家可以开枪,但是右边的角色不可以开枪

这是因为右边角色,指向武器的指针是空的

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

 所以我们要让武器指针可以同步,这样就可以同步了

	//目前玩家手中的武器
	UPROPERTY(Replicated)
	class ASWeapen * CurrentWeapen1;

 要实现网络同步,必须还要有一个函数,这个函数定义在actor类里面

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

 我们将其复制到玩家类里面

	//用于网络同步的函数
	void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;

导入头文件

#include "Net/UnrealNetwork.h"

 定义这个函数

void ASCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
	//同步给所有的客户端和服务器
	DOREPLIFETIME(ASCharacter, CurrentWeapen1);
}

测试,两个角色都可以打枪了,但是互相看不见。

下面解决这个问题。

==========================================

给武器类添加成员函数serverfire()

	UFUNCTION(Server, Reliable, WithValidation)
		void ServerFire();

然后实现该函数的方式比较特殊

void ASWeapen::ServerFire_Implementation()
{
    Fire();
}

bool ASWeapen::ServerFire_Validate()
{
	return true;
}

 然后我们修改一下Fire()函数

void ASWeapen::Fire()
{
	//如果不是服务器,就执行ServerFire()
	if (Role < ROLE_Authority)
	{
		ServerFire();
		return;
	}
	//创建一个撞击句柄,用来获取弹道相关信息
	FHitResult Hit;
	//弹道的起点,我们设置为角色眼睛的位置
	AActor * MyOwner = GetOwner();
	if (MyOwner)
	{	//位置
		FVector EyeLocation;
		//方向
		FRotator EyeRotator;
		//得到眼睛的位置和角度
		MyOwner->GetActorEyesViewPoint(EyeLocation, EyeRotator);
		//弹道的终点就是起点+方向*10000
		FVector TraceEnd = EyeLocation + (EyeRotator.Vector() * 1000);
		//弹道特效的结束点
		FVector TraceEndPoint = TraceEnd;
		//设置碰撞通道为可见性通道
		FCollisionQueryParams  QueryParams;
		//让射线忽略玩家和枪
		QueryParams.AddIgnoredActor(MyOwner);
		QueryParams.AddIgnoredActor(this);
		//符合追踪设为true,可以让射击更加精准
		QueryParams.bTraceComplex = true;
		//返回命中目标的表面材质
		QueryParams.bReturnPhysicalMaterial = true;


		//在创建一个单轨迹线来计算弹道
		//LineTraceSingleByChannel击中物体返回true
		if (GetWorld()->LineTraceSingleByChannel(Hit, EyeLocation, TraceEnd, COLLISION_WEAPON, QueryParams))
		{
			//命中对象
			AActor * HitActor = Hit.GetActor();
			//实际的伤害
			float ActualDamage = BaseDamage;
			//得到命中物体表面材质
			EPhysicalSurface SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());
			//如果命中的是头部表面材质,伤害变成四倍
			if (SurfaceType == SURFACE_FLESHVULNERABLE)
			{
				ActualDamage *= 4;
			}

			//造成点伤害ApplyPointDamage
			//参数分别为命中对象、基础伤害、射击方向、命中信息(命中句柄)、MyOwner->GetInstigatorController(暂时不了解)
			//this(射击者) 和伤害类型 
			UGameplayStatics::ApplyPointDamage(HitActor, ActualDamage, EyeRotator.Vector(), Hit, MyOwner->GetInstigatorController(), this, DamageType);

			//根据材质的不同,进行不同的处理
			UParticleSystem * SelectedEffect = nullptr;
			switch (SurfaceType)
			{
				//这两种情况是一个效果
			case SURFACE_FLESHDEFAULT:
			case SURFACE_FLESHVULNERABLE:
				SelectedEffect = FleshImpactEffect;
				break;
			default:
				SelectedEffect = DefaultImpactEffect;
				break;

			}

			//生成特效在命中点
			//ImpactEffect:特效 ImpactPoint:打击点 Rotation():打击方向
			if (SelectedEffect)
			{
				UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), SelectedEffect, Hit.ImpactPoint, Hit.ImpactNormal.Rotation());
			}
			//命中的时候,修改弹道特效的终点
			TraceEndPoint = Hit.ImpactPoint;



		}
		//方便debug
		//DrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1, 0, 1);
		//射击特效
		PlayFireEffects(TraceEndPoint);
		//最后开火的时间
		FireLastTime = GetWorld()->TimeSeconds;
	}

}

编译,测试,服务器端开火,客户端看不到(不管控制哪个角色,都是在服务器端看到开火)

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

 18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

 修改一下代码,我们把return去掉

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

 编译测试

服务器端开火,客户端看不到;客户端开火,同时可以看到

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】 18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

 给角色蓝图添加两个节点

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

===========================================

目前

操作客户端,两端都能看到特效18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

 操作服务器端,客户端看不到特效

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

在武器类的头文件中,创建结构体

USTRUCT()
struct FHitScanTrace
{
	GENERATED_BODY()
public:
	//弹道的目的坐标
	UPROPERTY()
	FVector_NetQuantize TraceTo;
	//子弹数目:为了让该结构体内容发生变化,结构体才被不断得被网络复制
	UPROPERTY()
	uint8 BrustCounter;

};

创建该类中的结构体成员变量,和对应的网络复制函数

	//网络射击信息
	UPROPERTY(ReplicatedUsing = OnRep_HitScanTrace)
	FHitScanTrace HitScanTrace;

	//网络复制函数
	UFUNCTION()
	void OnRep_HitScanTrace();

当结构体内容发生改变的时候,就会自动调用网络复制函数

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

在fire函数里面,更新网络射击信息

		//更新网络射击信息
		if (Role == ROLE_Authority)
		{
			//子弹数量++
			HitScanTrace.BrustCounter++;
			//更新弹道目的坐标
			HitScanTrace.TraceTo = TraceEndPoint;

		}
void ASWeapen::Fire()
{
	//如果不是服务器,就执行ServerFire()
	if (Role < ROLE_Authority)
	{
		ServerFire();
		
	}
	//创建一个撞击句柄,用来获取弹道相关信息
	FHitResult Hit;
	//弹道的起点,我们设置为角色眼睛的位置
	AActor * MyOwner = GetOwner();
	if (MyOwner)
	{	//位置
		FVector EyeLocation;
		//方向
		FRotator EyeRotator;
		//得到眼睛的位置和角度
		MyOwner->GetActorEyesViewPoint(EyeLocation, EyeRotator);
		//弹道的终点就是起点+方向*10000
		FVector TraceEnd = EyeLocation + (EyeRotator.Vector() * 1000);
		//弹道特效的结束点
		FVector TraceEndPoint = TraceEnd;
		//设置碰撞通道为可见性通道
		FCollisionQueryParams  QueryParams;
		//让射线忽略玩家和枪
		QueryParams.AddIgnoredActor(MyOwner);
		QueryParams.AddIgnoredActor(this);
		//符合追踪设为true,可以让射击更加精准
		QueryParams.bTraceComplex = true;
		//返回命中目标的表面材质
		QueryParams.bReturnPhysicalMaterial = true;


		//在创建一个单轨迹线来计算弹道
		//LineTraceSingleByChannel击中物体返回true
		if (GetWorld()->LineTraceSingleByChannel(Hit, EyeLocation, TraceEnd, COLLISION_WEAPON, QueryParams))
		{
			//命中对象
			AActor * HitActor = Hit.GetActor();
			//实际的伤害
			float ActualDamage = BaseDamage;
			//得到命中物体表面材质
			EPhysicalSurface SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());
			//如果命中的是头部表面材质,伤害变成四倍
			if (SurfaceType == SURFACE_FLESHVULNERABLE)
			{
				ActualDamage *= 4;
			}

			//造成点伤害ApplyPointDamage
			//参数分别为命中对象、基础伤害、射击方向、命中信息(命中句柄)、MyOwner->GetInstigatorController(暂时不了解)
			//this(射击者) 和伤害类型 
			UGameplayStatics::ApplyPointDamage(HitActor, ActualDamage, EyeRotator.Vector(), Hit, MyOwner->GetInstigatorController(), this, DamageType);

			//根据材质的不同,进行不同的处理
			UParticleSystem * SelectedEffect = nullptr;
			switch (SurfaceType)
			{
				//这两种情况是一个效果
			case SURFACE_FLESHDEFAULT:
			case SURFACE_FLESHVULNERABLE:
				SelectedEffect = FleshImpactEffect;
				break;
			default:
				SelectedEffect = DefaultImpactEffect;
				break;

			}

			//生成特效在命中点
			//ImpactEffect:特效 ImpactPoint:打击点 Rotation():打击方向
			if (SelectedEffect)
			{
				UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), SelectedEffect, Hit.ImpactPoint, Hit.ImpactNormal.Rotation());
			}
			//命中的时候,修改弹道特效的终点
			TraceEndPoint = Hit.ImpactPoint;



		}
		//方便debug
		//DrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1, 0, 1);
		//射击特效
		PlayFireEffects(TraceEndPoint);
		//更新网络射击信息
		if (Role == ROLE_Authority)
		{
			//子弹数量++
			HitScanTrace.BrustCounter++;
			//更新弹道目的坐标
			HitScanTrace.TraceTo = TraceEndPoint;

		}
		//最后开火的时间
		FireLastTime = GetWorld()->TimeSeconds;
	}

}

定义网络复制函数,让其执行射击特效

void ASWeapen::OnRep_HitScanTrace()
{
	//调用射击特效
	PlayFireEffects(HitScanTrace.TraceTo);
}

此时,网络射击信息结构体变量还没有实现网络的复制共享,我们让其共享。

创建复制成员变量的函数

void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;

定义这个函数

void ASWeapen::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
	//同步给所有的客户端和服务器(DOREPLIFETIME_CONDITION不用同步给自己)
	DOREPLIFETIME_CONDITION(ASWeapen, HitScanTrace,COND_SkipOwner);
}

编译,测试

发现服务器端射击的时候,客户端可以看到弹道的特效,但看不到击中特效

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

 ============================================

现在解决一下这个问题

为网络射击结构体添加表面材质成员变量

	//表面材质
	UPROPERTY()
	TEnumAsByte<EPhysicalSurface> SurfaceType;

在fire函数里面为其赋值

		//更新网络射击信息
		if (Role == ROLE_Authority)
		{
			//子弹数量++
			HitScanTrace.BrustCounter++;
			//更新弹道目的坐标
			HitScanTrace.TraceTo = TraceEndPoint;
			//更新击中物体的材质
			HitScanTrace.SurfaceType = SurfaceType;

		}

我们为击中特效的生成做成一个函数

	//击中特效
	void PlayImpactEffects(EPhysicalSurface SurfaceType , FVector ImpactPoint);

定义这个函数

void ASWeapen::PlayImpactEffects(EPhysicalSurface SurfaceType , FVector ImpactPoint)
{

	//根据材质的不同,进行不同的处理
	UParticleSystem * SelectedEffect = nullptr;
	switch (SurfaceType)
	{
		//这两种情况是一个效果
	case SURFACE_FLESHDEFAULT:
	case SURFACE_FLESHVULNERABLE:
		SelectedEffect = FleshImpactEffect;
		break;
	default:
		SelectedEffect = DefaultImpactEffect;
		break;

	}

	//生成特效在命中点
	//ImpactEffect:特效 ImpactPoint:打击点 Rotation():打击方向
	if (SelectedEffect)
	{
		//计算枪口位置
		FVector MuzzleLocation = MeshComponent->GetSocketLocation("MuzzleSocket");
		//射击方向向量 = 打击点-枪口
		FVector ShotDirection = ImpactPoint - MuzzleLocation;
		UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), SelectedEffect, ImpactPoint, ShotDirection.Rotation());
	}
}

完善一下复制函数内容函数

void ASWeapen::OnRep_HitScanTrace()
{
	//调用射击特效
	PlayFireEffects(HitScanTrace.TraceTo);
	//生成命中特效
	PlayImpactEffects(HitScanTrace.SurfaceType, HitScanTrace.TraceTo);
}

完善fire函数

void ASWeapen::Fire()
{
	//如果不是服务器,就执行ServerFire(),服务器端就有响应
	if (Role < ROLE_Authority)
	{
		ServerFire();
		
	}
	//创建一个撞击句柄,用来获取弹道相关信息
	FHitResult Hit;
	//弹道的起点,我们设置为角色眼睛的位置
	AActor * MyOwner = GetOwner();
	//击中物体的材质
	EPhysicalSurface SurfaceType = EPhysicalSurface::SurfaceType_Default;

	if (MyOwner)
	{	//位置
		FVector EyeLocation;
		//方向
		FRotator EyeRotator;
		//得到眼睛的位置和角度
		MyOwner->GetActorEyesViewPoint(EyeLocation, EyeRotator);
		//弹道的终点就是起点+方向*10000
		FVector TraceEnd = EyeLocation + (EyeRotator.Vector() * 1000);
		//弹道特效的结束点
		FVector TraceEndPoint = TraceEnd;
		//设置碰撞通道为可见性通道
		FCollisionQueryParams  QueryParams;
		//让射线忽略玩家和枪
		QueryParams.AddIgnoredActor(MyOwner);
		QueryParams.AddIgnoredActor(this);
		//符合追踪设为true,可以让射击更加精准
		QueryParams.bTraceComplex = true;
		//返回命中目标的表面材质
		QueryParams.bReturnPhysicalMaterial = true;


		//在创建一个单轨迹线来计算弹道
		//LineTraceSingleByChannel击中物体返回true
		if (GetWorld()->LineTraceSingleByChannel(Hit, EyeLocation, TraceEnd, COLLISION_WEAPON, QueryParams))
		{
			//命中对象
			AActor * HitActor = Hit.GetActor();
			//实际的伤害
			float ActualDamage = BaseDamage;
			//得到命中物体表面材质
			EPhysicalSurface SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());
			//如果命中的是头部表面材质,伤害变成四倍
			if (SurfaceType == SURFACE_FLESHVULNERABLE)
			{
				ActualDamage *= 4;
			}

			//造成点伤害ApplyPointDamage
			//参数分别为命中对象、基础伤害、射击方向、命中信息(命中句柄)、MyOwner->GetInstigatorController(暂时不了解)
			//this(射击者) 和伤害类型 
			UGameplayStatics::ApplyPointDamage(HitActor, ActualDamage, EyeRotator.Vector(), Hit, MyOwner->GetInstigatorController(), this, DamageType);
			//生成命中特效
			PlayImpactEffects(SurfaceType, Hit.ImpactPoint);

			//命中的时候,修改弹道特效的终点
			TraceEndPoint = Hit.ImpactPoint;

		}
		//方便debug
		//DrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1, 0, 1);
		//射击特效
		PlayFireEffects(TraceEndPoint);
		//更新网络射击信息
		if (Role == ROLE_Authority)
		{
			//子弹数量++
			HitScanTrace.BrustCounter++;
			//更新弹道目的坐标
			HitScanTrace.TraceTo = TraceEndPoint;
			//更新击中物体的材质
			HitScanTrace.SurfaceType = SurfaceType;

		}
		//最后开火的时间
		FireLastTime = GetWorld()->TimeSeconds;
	}

}

编译,测试,两边特效同步了 

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

============================

现在是死亡不同步

打开生命值组件

首先在游戏开始函数里判断当前是否是服务器,如果是服务器,才绑定受伤

// Called when the game starts
void USHealthComponent::BeginPlay()
{
	Super::BeginPlay();
	//这就意味着客户端不会响应受伤事件
	if (GetOwnerRole() == ROLE_Authority)
	{
		AActor * Owner = GetOwner();
		//将该函数绑定在角色的受伤事件上
		if (Owner)
		{
			Owner->OnTakeAnyDamage.AddDynamic(this, &USHealthComponent::HandleTakeAnyDamage);
		}
	}

	Health = DefaultHealth;
	
	
}

在构造函数中设为可网路复制

USHealthComponent::USHealthComponent()
{
	// Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
	// off to improve performance if you don't need them.
	PrimaryComponentTick.bCanEverTick = true;

	DefaultHealth = 100;
	//网络复制
	SetIsReplicated(true);
}

将其中的生命值成员变量声明为网路可复制

	//当前生命值
	UPROPERTY(Replicated, BlueprintReadOnly, Category = "HealthComponent")
	float Health;

并定义和声明相关同步函数

		//用于网络同步的函数
	void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
#include "Net/UnrealNetwork.h"
void USHealthComponent::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
	//同步给所有的客户端和服务器
	DOREPLIFETIME(USHealthComponent, Health);
}

打开角色类,将该变量设为网络可复制

	//是否死亡
	UPROPERTY(Replicated, BlueprintReadOnly, Category = "Player")
	bool bDied;

网络同步函数中,也进行同步一下

void ASCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
	//同步给所有的客户端和服务器
	DOREPLIFETIME(ASCharacter, CurrentWeapen1);
	DOREPLIFETIME(ASCharacter, bDied);
}

测试

同时倒地

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】

18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】 

 文章来源地址https://www.toymoban.com/news/detail-408816.html

到了这里,关于18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 幻兽帕鲁“加入多人游戏(专用服务器)”是什么意思?怎么搭建自己的幻兽帕鲁服务器?

    幻兽帕鲁游戏进入界面有个“加入多人游戏(专用服务器)”的选型,其实这个就是多人联机模式,它除了可以进入官方的服务器联机游戏,还可以连接到自己专门搭建的服务器里,去在一个比较私密的空间进行单人游戏或者几个朋友联机游戏。 幻兽帕鲁的专用服务器搭建是

    2024年02月22日
    浏览(36)
  • 幻兽帕鲁Palworld游戏服务器怎么搭建?Linux上搭建幻兽帕鲁多人服务器教程

    幻兽帕鲁(Palworld)自1月19日上线以来,仅仅3天时间销量便突破了500万份,目前游戏的同时在线人数已经来到了Steam历史第五,由于前四名均是免费游戏,所以本作也成为了目前Steam付费游戏的在线人数第一,甚至还因为在线人数过多导致官方出现了服务器问题。  搭建服务器

    2024年02月21日
    浏览(37)
  • 11uec++多人游戏【自定义表面-物理材质】

    打开编辑器设置,点击物理   拉到这个位置  设置两个表面材质  创建新的文件夹 创建物理材质 进入材质,赋予表面    打开该头文件 定义两个变量  打开武器类,将打击特效的名字改成默认特效,当没有打到人身上,就用这个特效。 导入头文件 完善fire函数 编译之后,

    2024年02月06日
    浏览(26)
  • 原神服务器服务端多人联机教程

    原神服务器服务端多人联机教程 大家好,我是艾西在上一篇文章中我们说了win系统服务器怎么搭建原神服务端,在最后结尾时有带一嘴怎么改为多人联机但不是很详细。哪么这篇文章艾西会给小伙伴们说清楚原神服务端怎么改为多人联机,毕竟玩游戏肯定得和朋友一起玩才有

    2024年02月05日
    浏览(31)
  • 阿里云国际-在阿里云服务器上快速搭建幻兽帕鲁多人服务器

    幻兽帕鲁是最近流行的新型生存游戏。该游戏一夜之间变得极为流行,同时在线玩家数量达到了200万。然而,幻兽帕鲁的服务器难以应对大量玩家的压力。为解决这一问题,幻兽帕鲁允许玩家建立专用服务器,其提供以下优势: (1)更高的稳定性,减少崩溃或停机的风险;

    2024年02月21日
    浏览(41)
  • 幻兽帕鲁服务器怎么搭建?Palworld多人联机教程

    玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服务器教程: 阿里云幻兽帕鲁服务器搭建 由于是在阿里

    2024年02月22日
    浏览(37)
  • 幻兽帕鲁:自建多人联机服务器,支持32人联机

     Steam游戏《幻兽帕鲁》是新上线的一款开服世界生存制作游戏,上线短短5天时间,就卖出了700万份,同时在线人数最高达到180万人,创下了Steam历史榜单第二名的好成绩。预期之外的爆火使幻兽帕鲁官方服务器正面临大量玩家涌入而导致的服务器网络拥堵问题,很多玩家反馈

    2024年02月20日
    浏览(35)
  • 保障Linux服务器安全:多人共用环境下的防护策略

    引言 在多人共用的Linux服务器环境中,确保系统安全至关重要。不仅要防止外部攻击,还要防止内部用户的不当操作或恶意行为。本文将探讨在多人共用Linux服务器时,如何采取有效策略来保障系统安全,防止“坏事”发生。 使用sudo和权限分组 :避免给予用户过多的权限。

    2024年04月10日
    浏览(38)
  • 阿里云幻兽帕鲁多人联机服务器多少钱?4核16G或8核32G配置

    2024阿里云幻兽帕鲁专用服务器价格表:4核16G幻兽帕鲁专用服务器26元一个月、149元半年,默认10M公网带宽,8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例,CPU采用Intel Xeon Platinum可扩展处理器。阿里云不仅提供幻兽帕鲁服务

    2024年04月28日
    浏览(35)
  • 解决Windows Server 多人远程过期导致 “由于没有远程桌面授权服务器可以提供许可证……“(亲测可用

    Windows server 2012服务器远程桌面登录时出现错误提示:“由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。请跟服务器管理员联系。 出现这个报错的原因有两种: 1. 系统添加了“远程桌面会话主机”角色后,该授权到期(可以免费试用120天,到期需要付费才能

    2024年04月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包