技术好文共享:(官网)虚幻3

简介: 技术好文共享:(官网)虚幻3

相机技术指南


相机技术指南


概述


相机


后期特效


镜头特效


相机动画


相机修改器


Player Controller(玩家控制器)


Pawn


定制相机行为


示例 - CalcCamera


第一人称相机示例


第三人称相机示例


自上而下相机示例


等角相机示例


横向卷轴相机示例


一体化相机示例


示例 - 自定义相机


基础相机模块


自定义相机


基础控制模块


Engine 类重载


PlayerController


Pawn 类


GameInfo 类


示例相机模块


示例控制模块


配置文件


概述


虚幻引擎 3 中供玩家使用的相机系统由三个主要类组成:Camera、Pawn 和 PlayerController。这些类都会交互以控制位置、旋转量以及任何其他在游戏过程中应该用于玩家相机的特效。


PlayerController 有一个对被使用的 Camera 以及被控制的 Pawn 的引用。PlayerController 会接收玩家的输入数据并将其用于更新它正在控制的 Pawn 的位置和旋转。默认情况下,Camera 会将其更新传递给 Pawn,它反过来会更新相机的位置和旋转。


通过修改这些类中的一个或多个及其交互方式,可以将玩家的相机设置为使用任何适合于您正在制作的游戏类型的视角向玩家显示这个游戏世界。默认情况下,玩家的相机会使用第一人称,并提供可以将其触发为一个第三人称肩后镜头视角的选项。可以轻松地将它改为自上而下视角、等角视图、横向卷轴视角或任何其他您的游戏可能需要的视图。


相机


camera类代表玩家进入世界的视角。玩家相机的位置和旋转量可以确定场景显示在屏幕上时进行渲染的视点。Camera 类还包含一些可以控制通过相机看到世界的方式的属性,例如,设置视图字段、屏幕长宽比等等。相机还具有可以被应用于它们的特效,例如后期处理、镜头特效、相机修改器、相机动画等等。


注意:所有 FOV 变量都是全角,用度数表示。


相机属性


通用


PCOwner – 引用拥有这个相机的 PlayerController。


CameraStyle – 该相机的当前相机模式。在视角没有被视图目标覆盖时,用于确定相机的类型(例如,第一人称、第三人称、自由等等)。


ViewTarget – 定义视图目标的当前数据。类型是 TViewTarget。


TViewTarget


Target – 相机是“以下”的目标 actor。


Controller – 如果是 Pawn,Target 的 Controller。


POV – Target 的理想视角。类型是 TPOV。


TPOV


Location – 视角的位置。


Rotation – 视点的旋转量。


FOV – 视点的全视角角度。


AspectRatio – 用于 Target 的屏幕长宽比。


PRI – 通过 pawn 平移可以用于跟踪同一个玩家的玩家函数复制信息。


FOV


DefaultFOV – 相机的默认视角。


bLockedFOV – 如果为真,相机的视角将会锁定为 LockedFOV 值。


LockedFOV – 锁定 FOV 时使用的视角。


屏幕长宽比


DefaultAspectRatio – 相机的默认长宽比。


bConstrainAspectRatio – 如果为真,相机的屏幕长宽比将被限制为 ConstrainedAspectRatio 的值。


ConstrainedAspectRatio – 在相机的屏幕长宽比受到限制时使用的长宽比。


相机函数


通用


UpdateCamera 【DeltaTime】 – 每帧调用一次对相机进行一次更新。


DeltaTime – 自从上一次更新发生开始的时间长度。


GetCameraViewPoint 【OutCamLoc】 【OutCamRot】 – 会检索相机的位置和旋转。不可直接调用该函数。相反,应该调用 PCOwner 的 GetPlayerViewPoint() 函数。


OutCamLoc – 会输出相机的位置。


OutCamRot – 会输出相机的旋转量。


ProcessViewRotation 【DeltaTime】 【OutViewRotation】 【OutDeltaRot】 – 由 PCOwner 调用,为相机提供一个可以改变这一帧的视图旋转变化量的机会。


DeltaTime – 自从上一次更新发生开始的时间长度。


OutViewRotation – 会输出相机的已调整视图旋转量。


OutDeltaRot – 输出相机的已调整 delta 旋转量。


FOV


GetFOVAngle – 会返回相机的当前视角。


SetFOV 【NewFOV】 – 会将相机的视角设置为 NewFOV 值。


NewFOV – 为相机的视角设置的值。


视图目标


SetViewTarget 【NewViewTarget】 【TransitionParams】 – 设置相机的视图目标。


NewViewTarget – 设置为相机新的视图目标的 Actor。


TransitionParams – 混合参数以便可以在平移到新的视图目标时使用。


UpdateViewTarget 【OutVT】 【DeltaTime】 – 根据帧进行调用将视图目标更新为它的新位置、旋转量和 fov。 如果使用自定义相机(与视图目标 actor 中覆盖 CalcCamera() 相对),这是覆盖以便实现您希望的行为的关键函数。


OutVT – 会输出一个含有相机的视图目标和视点的数据结构。


DeltaTime – 自从上一次更新发生开始的时间长度。


后期特效


后期特效是在向玩家展示之前应用于已渲染的场景的效果。每个相机都可以使用它自己的后期处理设置的集合,可以覆盖世界、音量、或默认后期特效设置。


要了解更多有关后期特效的信息,请参阅 PostProcessEditorUserGuide(后期编辑器用户指南)、PostProcessTechnicalGuide(后期技术指南)以及 PostProcessMaterials(后期材质)。


后期特效属性


CameOverridePostProcessAlpha – 设置与世界、体积或默认后期特效设置相关的相机的后期特效设置的作用范围。值 0.0 表示世界、体积或默认后期特效都具有全部作用。值 1.0 表示相机的后期特效具有全部作用范围。


CamPostProcessSettings – 当相机覆盖世界、体积或默认后期特效的时候使用的后期特效设置。


bEnableColorScaling – 如果为真,最终图像中的颜色通道将会使用 ColorScale 值进行调整。


ColorScale – 在最终图像中各个颜色通道调整向量。


bEnableColorScaleInterp – 如果为真,相机将会在通过 SetDesiredColorScale() 函数设置的新颜色调整值时插入到颜色调整值之间。


bEnableFading – 如果为真,相机会将 FadeColor 的 FadeAmount 应用到画面中。


FadeColor – 相机淡入淡出时画面使用的颜色。


FadeAmount – 使用的淡入淡出量。实质上就是淡入淡出的滤镜。


后期特效函数


SetDesiredColorScale 【NewColorScale】 【InterpTime】 – 根据 bEnableColorScaleInterp 的值设置新的颜色调整值并有选择地插入。


NewColorScale – 可以用于颜色调整的新值。


InterpTime – 进入到新颜色调整值所需要的时间长度。


镜头特效


镜头特效是粒子特效,可以将其用于玩家的相机的镜头。这些镜头特效可以用于创建诸如相机镜头中下的雨滴、血溅、镜头上的污物或灰尘等等这一类的效果。这个 camera 类会包含可以使用这些特效类型的函数。


要了解有关粒子系统和特效的更多信息,请参阅ParticleSystemReference(粒子系统参考)。


镜头特效属性


CameraLensEffects – 当前应用于相机的所有粒子特效的数组。


镜头特效函数


FindCameraLensEffect 【LensEffectEmitterClass】 – 会搜索当前应用于相机的镜头特效并返回任何与之匹配的类型。


LensEffectEmitterType – 要搜索的镜头特效的类。


AddCameraLensEffect 【LensEffectEmitterClass】 – 会将指定类型的新镜头特效应用于相机中。


LensEffectEmitterClass – 要应用到相机中的镜头特效的类。


RemoveCameraLensEffect 【Emitter】 – 从相机中删除一个镜头特效。


Emitter – 要从相机中删除的镜头特效。


ClearCameraLensEffects – 删除当前应用于相机中的所有镜头特效。


相机动画


相机动画是那些可以在 Matinee 中创建的动画(或者可以选择在一个外部动画编辑器中创建,然后将其导入),它在游戏的过程中使用动画的平移和旋转信息来偏置相机。它们还提供模拟功能,通常可以在 Matinee 中模拟相机的任何其他属性,例如,FOV 或后期特效。它对于创建诸如相机振动、手持式相机的手惯性摆动的特效或者任何其他动画特效都十分有效。


要了解有关创建相机动画的更多信息,请参阅SettingUpCameras(设置相机).


相机动画函数


PlayCameraAnim 【CameraAnim】 【Rate】 【Scale】 【BlendInTime】 【BlendOutTime】 【bLoop】 【bRandomStartTime】 【Duration】 【bSingleInstance】 – 在相机上播放一个相机动画。


CameraAnim – 要播放的相机动画。


Rate – 可选项。播放相机动画的速度。


Scale – 可选项。应用于相机动画变换控件的强度加强器。


BlendInTime – 可选项。淡入相机动画所需的时间长度。


BlendOutTime – 可选项。淡出相机动画所需的时间长度。


bLoop – 可选项。如果是真,相机动画将继续循环直到明确要求它停止。


bRandomStartTime – 可选项。如果为真,相机动画将会在动画的时间轴上任意一个时间点开始播放。


Duration – 可选项。播放动画的时间长度。如果没有设置。将会播放整个动画。


bSingleInstance – 可选项。如果是真,同一时间只允许存在一个相机振动实例。


StopAllCameraAnims 【bImmediate】 – 停止所有当前播放的相机动画。


bImmediate – 可选项。如果是真,动画将会立即停止,忽略不计任何混合延时设置。


StopAllCameraAnimsByType 【Anim】 【bImmediate】 – 会停止相机动画的某个特定类型的所有实例。


Anim – 要停止的相机动画的类型。


bImmediate – 可选项。如果是真,动画将会立即停止,忽略不计任何混合延时设置。


StopCameraAnim 【AnimInst】 【bImmediate】 – 会停止某个相机动画的某个特定实例。


AnimInst – 要停止的相机动画实例。


bImmediate – 可选项。如果是真,动画将会立即停止,忽略不计任何混合延时设置。


相机修改器


相机修改器是应用于相机时可以修改相机的属性的物体。CameraModifier 类是这些效果的基类。通过建这个类的子类并覆盖其中的函数,完全自定义可以创建的修改器。CameraModifier_CameraShake 类是一个可以通过使用相机修改器完成的很恰当的示例。


相机修改器属性


ModifierList – 当前应用于相机上的所有相机修改器的数列


CameraShakeModClass – 用于减振型相机振动的类。例如,Kismet 中非相机动画画面振动。


相机修改器函数


PlayCameraShake 【Shake】 【Scale】 【PlaySpace】 【UserPlaySpaceRot】 – 会在相机上播放相机振动效果。


Shake – 用于相机振动效果的 CamerShake 设置。


Scale – 可以放大相机振动设置的缩放因素。


PlaySpace – 可选项。可以用于相机振动的播放空间。


UserPlaySpaceRot – 可选项。可以用于用户定义的播放空间的旋转量。


StopCameraShake 【Shake】 – 会停止在相机上播放相机振动效果。


Shake – 要停止播放的相机振动效果。


CalcRadialCameraShake 【Cam】 【Epicenter】 【InnerRadius】 【OuterRadius】 【Falloff】 – 会计算并为一个具有径裂的特定相机返回强度。


Cam – 要计算密度的相机。


Epicenter – 产生相机振动的起源位置。


InnerRadius – 距离衰减开始的 epicenter 的距离。


OuterRadius – 距离相机振动效果结束的 epicenter 的距离。


Falloff – 用于计算强度衰减的指数。


PlayWorldCameraShake 【Shake】 【ShakeInstigator】 【Epicenter】 【InnerRadius】 【OuterRadius】 【Falloff】 【bTrForceFeedback】 【bOrientShakeTowardEpicenter】 – 播放会影响所有附近相机的世界相机振动。


Shake – 要播放的相机振动。


ShakeInstigator – 发起相机振动的 Actor。


Epicenter – 产生相机振动的起源位置。


InnerRadius – 距离衰减开始的 epicenter 的距离。


OuterRadius – 距离相机振动效果结束的 epicenter 的距离。


Falloff – 用于计算强度衰减的指数。


bTryForceFeedback – 如果是真,强制反馈将会尝试被应用于任何受影响的控制器。


bOrientShakeTowardEpicenter – 可选项。如果是真,相机振动中的任何偏移都将相对面向 epicenter 进行使用,X 轴正方向朝向 epicenter。


ClearAllCameraShakes – 会删除当前应用于相机的所有相机振动。


Player Controller(玩家控制器)


PlayerController 主要负责将玩家输入平移到游戏动作中,例如移动一个 Pawn 或控制相机。PlayerController 的旋转量使相机旋转很常用,尽管这不是严格必需。 创建新的相机视角时,可能必需更新或覆盖一些 PlayerController 类中的功能,因为每个不同的相机类型将玩家的输入平移到 Pawn 中的运动和方向都有所不同。下面将会介绍一些与运动和相机有关的属性和函数。


玩家控制器属性


PlayerCamera – 引用玩家的相机。


CameraClass – 要对玩家使用的相机的类。


ViewTarget – 玩家相机的当前视图目标。


RealViewTarget – 玩家的相机的视图目标的玩家函数复制信息。


FOVangle – 玩家的相机的视角。


DefaultFOV – 用于玩家的相机的默认视角。


玩家控制器函数


GetPlayerViewPoint 【out_Location】 【out_Rotation】 – 它会返回 Controller 的 Pawn 的视点。对于人类玩家来说,这是指相机的视角。对于AI-控制的玩家来说,这个函数是Pawn眼中的视角。在这个基本的实现过程中,它只是 Controller 自己的位置和旋转量。


out_Location – 会输出玩家的视点位置。


out_Rotation – 会输出玩家的视点旋转量。


GetActorEyesViewPoint 【out_Location】 【out_Rotation】 – 它会返回 Controller 或者其 Pawn(如果存在一个)的视点。基本上,它会返回玩家从哪个位置和方向观看。


out_Location – 会输出玩家的眼睛的位置。


out_Rotation – 会输出玩家的眼睛的旋转量。


UpdateRotation 【DeltaTime】 – 它会更新基于玩家的输入的 Controller 及该 Controller 的 Pawn 的旋转量。


DeltaTime – 自从上一次更新发生开始的时间长度。


ProcessViewRotation 【DeltaTime】 【out_ViewRotation】 【DeltaRot】 – 调用它可以允许对控制器的视图旋转量进行任何修改(例如,固定)。 从 UpdateRotation() 中调用。


DeltaTime – 自从上一次更新发生开始的时间长度。


out_ViewRotation – 会输出玩家的视图旋转量。


DeltaRot – 由于玩家输入使旋转量发生改变。


PlayerMove 【DeltaTime】 – 它会为当前的移动计算新的加速度和旋转量值,然后调用 ProcessMove()(针对单个玩家或监听服务器)或 ReplicateMove()(针对网络客户端)。这只是基本 PlayerController 类中的一个存根,但是它在与运动有关的特定状态中被覆盖,例如 PlayerWalking 状态。每个循环都会从 PlayerTick() 函数中调用这个函数。


ProcessMove 【DeltaTime】 【newAccel】 【DoubleClickMove】 【DeltaRot】 – 它会处理客户端上的当前移动。该函数被覆盖在运动需要特殊功能才能运动的特定状态内部。


Pawn


Pawn 不只是玩家在世界中肉体的代表,还可以负责控制玩家的相机的位置和旋转量。它包含可以被覆盖的函数,创建完全新的相机视角。如下所示是一些与相机相关的函数。


Pawn 函数


CalcCamera 【DeltaTime】 【out_CamLoc】 【out_CamRot】 【out_FOV】 – 它会在从 Pawn 角度浏览时计算相机的视点。这是玩家的主要相机计算。


DeltaTime – 自从上一次更新发生开始的时间长度。


out_CamLoc – 会输出相机的位置。


out_CamRot – 会输出相机的旋转量。


out_FOV – 会输出相机的视角。


GetDefaultCameraMode 【RequestedBy】 – 它会返回应该被用于这个 Pawn 的默认相机模式,例如一个名称。通常在具有 Pawn 的时候由控制器进行调用。


RequestedBy - 控制器请求默认相机模式。


ProcessViewRotation 【deltaTime】 【out_ViewRotation】 【out_DeltaRot】 – 它会为 pawn 提供影响玩家的视图旋转量的机会,然后返回最终视图旋转量作为 out_ViewRotation 参数。可以从 PlayerController 的 UpdateRotation() 函数中调用它。


deltaTime – 自从上一次更新发生开始的时间长度。


out_ViewRotation – 会输出 Pawn 的视角的旋转量。


out_DeltaRot – 会输出 delta 旋转量。


SetViewRotation 【NewRotation】 – 如果存在一个Controller则设置该Controller的旋转值,如果不存在Controller ,则设置Pawn本身的旋转值。


NewRotation – 要为 Pawn 的视图设置的新旋转量。


GetActorEyesViewPoint 【out_Location】 【out_Rotation】 – 这返回了Pawn的眼睛的位置及方位或者玩家的视角。对于第一人称视角来说,这和相机的位置及朝向一样。它也是会从这里开始执行大多数跟踪的视点。


out_Location – 会输出 Pawn 的眼睛的位置。


out_Rotation – 会输出 Pawn 的眼睛的旋转量。


定制相机行为


有2种主要的方法可以实现自定义您的相机。 视图目标 Pawn 可以执行 CalcCamera(),或者您可以创建一个自定义 Camera 扩展类。


执行 Pawn.CalcCamera() 对于简单易懂的相机模式非常有效。 通过这种方法有些功能可能不完全有作用,包括后期特效或相机动画。


创建一个自定义相机类可以消耗多一点进行设置,但是会得到更加全面功能化。 GameFramework.GamePlayerCamera 是这种方法的一个示例。


示例 - CalcCamera


下面是一些使用 Pawn 的 CalcCamera() 函数修改玩家相机视角以及在某些实例中如何处理玩家输入的基本示例。这并不表示所有您的相机需求都可以采用完全即插即用的解决方法。它们只是开始创建您自己的自定义相机设置的起始点。


很明显,建立这些正确可发行相机类型需要进行大量其他可以并应该进行的修改。您可能想要实现在任何非第一人称模式中通过滚动鼠标滚轮调整相机与玩家的距离这个功能。如果您不打算为避免这样的事情而专门设计您的关卡,那么用添加代码的方法避免相机在某些模式中侵占世界几何体,这个主意相当不错。此外,在某些模式中改变绘制瞄准线的方式而不是//代码效果参考:http://hnjlyzjd.com/xl/wz_25148.html

将其完全删除可能会更好。

所有这些示例都需要一个新的自定义游戏类型类,它可以通知游戏使用这个新的 Pawn 和 PlayerController 类。


UDNGame.uc


class UDNGame extends UTDeathMatch;


defaultproperties


{


DefaultPawnClass=class'UDNExamples.UDNPawn'


PlayerControllerClass=class'UDNExamples.UDNPlayerController'


MapPrefixes【0】="UDN"


}


将需要对 DefaultGame.ini 进行修改,以通知引擎同时将这个新的游戏类型作为默认值使用。


DefaultGame.ini


【Engine.GameInfo】


DefaultGame=UDNExamples.UDNGame


DefaultServerGame=UDNExamples.UDNGame


注意: //代码效果参考:http://hnjlyzjd.com/hw/wz_25146.html

为了要使用这个新的游戏类型,您将需要确保您的地图的前缀正确。我们会在我们的游戏类型中将这个前缀设置为"UDN",这样所有地图都将需要以"UDN-"为前缀进行命名。还可以使用编辑器中的地图快速测试这个新的游戏类型,将这个地图的 World Properties(世界属性)中的 Game Type PIE 属性设置为这个新的游戏类型。

第一人称相机示例


第一人称视角是从 UTPawn 扩展而来的所有 pawn 的默认相机类型。该示例会从每个相关的类中抽取组成相机类型的主要部分,并将其放置在新的子类中,以便可以更好地演示有关创建一个基本的第一人称相机的流程。


UDNPawn.uc


class UDNPawn extends UTPawn;


simulated function bool CalcCamera( float fDeltaTime, out vector out_CamLoc, out rotator out_CamRot, out float out_FOV )


{


// 计算第一人称相机位置和旋转量


GetActorEyesViewPoint( out_CamLoc, out_CamRot );


return true;


}


defaultproperties


{


}


UDNPlayerController.uc


class UDNPlayerController extends UTPlayerController;


state PlayerWalking


{


ignores SeePlayer, HearNoise, Bump;


function ProcessMove(float DeltaTime, vector NewAccel, eDoubleClickDir DoubleClickMove, rotator DeltaRot)


{


if( Pawn == None )


{


return;


}


if (Role == ROLE_Authority)


{


// 为远程客户端更新 ViewPitch


Pawn.SetRemoteViewPitch( Rotation.Pitch );


}


Pawn.Acceleration = NewAccel;


CheckJumpOrDuck();


}


}


function UpdateRotation( float DeltaTime )


{


local Rotator DeltaRot, newRotation, ViewRotation;


ViewRotation = Rotation;


if (Pawn!=none)


{


Pawn.SetDesiredRotation(ViewRotation);


}


// 计算将会应用在 ViewRotation 上的 Delta


DeltaRot.Yaw = PlayerInput.aTurn;


DeltaRot.Pitch = PlayerInput.aLookUp;


ProcessViewRotation( DeltaTime, ViewRotation, DeltaRot );


SetRotation(ViewRotation);


NewRotation = ViewRotation;


NewRotation.Roll = Rotation.Roll;


if ( Pawn != None )


Pawn.FaceRotation(NewRotation, deltatime);


}


defaultproperties


{


}


第三人称相机示例


第三人称相机设置同时被列为 UTPawn 的所有子类的备选相机类型。该示例会抽取主要部分并将默认相机覆盖为第三人称相机。


UDNPawn.uc


class UDNPawn extends UTPawn;


//覆盖使默认情况下的玩家网格物体可见


simulated event BecomeViewTarget( PlayerController PC )


{


local UTPlayerController UTPC;


Super.BecomeViewTarget(PC);


if (LocalPlayer(PC.Player) != None)


{


UTPC = UTPlayerController(PC);


if (UTPC != None)


{


//将玩家控制器设置在视图后面,并使网格物体可见


UTPC.SetBehindView(true);


SetMeshVisibility(UTPC.bBehindView);


}


}


}


simulated function bool CalcCamera( float fDeltaTime, out vector out_CamLoc, out rotator out_CamRot, out float out_FOV )


{


local vector CamStart, HitLocation, HitNormal, CamDirX, CamDirY, CamDirZ, CurrentCamOffset;


local float DesiredCameraZOffset;


CamStart = Location;


CurrentCamOffset = CamOffset;


DesiredCameraZOffset = (Health > 0) ? 1.2 GetCollisionHeight() + Mesh.Translation.Z : 0.f;


CameraZOffset = (fDeltaTime < 0.2) ? DesiredCameraZOffset 5 fDeltaTime + (1 - 5fDeltaTime) CameraZOffset : DesiredCameraZOffset;


if ( Health <= 0 )


{


CurrentCamOffset = vect(0,0,0);


CurrentCamOffset.X = GetCollisionRadius();


}


CamStart.Z += CameraZOffset;


GetAxes(out_CamRot, CamDirX, CamDirY, CamDirZ);


CamDirX = CurrentCameraScale;


if ( (Health <= 0) || bFeigningDeath )


{


// 调整相机位置,确保它没有剪切到世界中


// @todo fixmesteve. 注意:如果 FindSpot 失败,您仍然可以获得剪切(很少发生)


FindSpot(GetCollisionExtent(),CamStart);


}


if (CurrentCameraScale CameraScale)


{


CurrentCameraScale = FMax(CameraScale, CurrentCameraScale - 5 FMax(CameraScale - CurrentCameraScale, 0.3)fDeltaTime);


}


if (CamDirX.Z > GetCollisionHeight())


{


CamDirX = square(cos(out_CamRot.Pitch 0.0000958738)); // 0.0000958738 = 2PI/65536


}


out_CamLoc = CamStart - CamDirXCurrentCamOffset.X + CurrentCamOffset.YCamDirY + CurrentCamOffset.ZCamDirZ;


if (Trace(HitLocation, HitNormal, out_CamLoc, CamStart, false, vect(12,12,12)) != None)


{


out_CamLoc = HitLocation;


}


return true;


}


defaultproperties


{


}


UDNPlayerController.uc


class UDNPlayerController extends UTPlayerController;


state PlayerWalking


{


ignores SeePlayer, HearNoise, Bump;


function ProcessMove(float DeltaTime, vector NewAccel, eDoub

相关文章
|
8月前
|
存储 JSON 缓存
实战教程·元宇宙来了,准备好你的电子名片了吗?(八)(1)
实战教程·元宇宙来了,准备好你的电子名片了吗?
54 0
实战教程·元宇宙来了,准备好你的电子名片了吗?(八)(1)
|
8月前
|
存储 安全 容器
实战教程·元宇宙来了,准备好你的电子名片了吗?(七)(5)
实战教程·元宇宙来了,准备好你的电子名片了吗?(七)
49 0
实战教程·元宇宙来了,准备好你的电子名片了吗?(七)(5)
|
8月前
实战教程·元宇宙来了,准备好你的电子名片了吗?(七)(3)
实战教程·元宇宙来了,准备好你的电子名片了吗?(七)
22 0
实战教程·元宇宙来了,准备好你的电子名片了吗?(七)(3)
|
8月前
|
JSON API 数据格式
实战教程·元宇宙来了,准备好你的电子名片了吗?(五)(4)
实战教程·元宇宙来了,准备好你的电子名片了吗?(五)
49 0
|
3天前
|
传感器 存储 数据采集
技术好文共享:焕新!CANape19真香!
技术好文共享:焕新!CANape19真香!
|
3天前
|
数据采集 XML JSON
技术好文共享:老司机教你下载tumblr上视频和图片的正确姿势
技术好文共享:老司机教你下载tumblr上视频和图片的正确姿势
|
3天前
|
前端开发
技术好文共享:第二十二webchat(2)
技术好文共享:第二十二webchat(2)
|
8月前
实战教程·元宇宙来了,准备好你的电子名片了吗?(七)(2)
实战教程·元宇宙来了,准备好你的电子名片了吗?(七)
37 0
实战教程·元宇宙来了,准备好你的电子名片了吗?(七)(2)
|
8月前
|
存储 前端开发 Swift
实战教程·元宇宙来了,准备好你的电子名片了吗?(五)(1)
实战教程·元宇宙来了,准备好你的电子名片了吗?(五)
38 0
实战教程·元宇宙来了,准备好你的电子名片了吗?(五)(1)
|
8月前
实战教程·元宇宙来了,准备好你的电子名片了吗?(六)(2)
实战教程·元宇宙来了,准备好你的电子名片了吗?(六)
41 0
实战教程·元宇宙来了,准备好你的电子名片了吗?(六)(2)