UDN
Search public documentation:
DevelopmentKitGemsCreatingActorSelectionBoxesOrBracketsCH
English Translation
日本語訳
한국어
Interested in the Unreal Engine?
Visit the Unreal Technology site.
Looking for jobs and company info?
Check out the Epic games site.
Questions about support via UDN?
Contact the UDN Staff
日本語訳
한국어
Interested in the Unreal Engine?
Visit the Unreal Technology site.
Looking for jobs and company info?
Check out the Epic games site.
Questions about support via UDN?
Contact the UDN Staff
创建 actor 选择方框
最后一次测试是在2011年3月份的UDK版本上进行的。
可以与 PC 和 iOS 兼容
概述
GameInfo
class ASIGameInfo extends UTDeathMatch; defaultproperties { bUseClassicHUD=true HUDType=class'ASIHUD' }
相关主题
HUDInterface
interface ASIHUDInterface;
if (PawnSubClass(Actor) != None || VehicleSubClass(Actor) != None || DroppedPickupSubClass(Actor) != None) { RenderActorSelection(Actor); }
if (ASIHUDInterface(Actor) != None) { RenderActorSelection(Actor, ASIHUDInterface(Actor)); }
相关主题
HUD
class ASIHUD extends UTHUD; event PostRender() { local Actor HitActor; local Vector HitLocation, HitNormal, EyeLocation; local Rotator EyeRotation; Super.PostRender(); // 确保对玩家所有者进行设置 if (PlayerOwner != None) { // 获取玩家相机位置和旋转量 PlayerOwner.GetPlayerViewPoint(EyeLocation, EyeRotation); // 执行跟踪找出这个玩家查看的地方 // 使用跟踪 actor,这样我们可以忽略不重要的对象 ForEach TraceActors ( class'Actor', HitActor, HitLocation, HitNormal, EyeLocation + Vector(EyeRotation) * PlayerOwner.InteractDistance, EyeLocation, Vect(1.f, 1.f, 1.f),, TRACEFLAG_Bullet ) { // 如果点击 actor 是玩家所有者,那么这个玩家所有者的 pawn 或点击 actor 不可见 if (HitActor == PlayerOwner || HitActor == PlayerOwner.Pawn || !FastTrace(HitActor.Location, EyeLocation)) { // 忽略这个点击 actor continue; } // 在这里渲染这个 actor 选择 } } }
enum EActorBracketStyle { EABS_2DActorBrackets, EABS_3DActorBrackets, EABS_2DBox, EABS_3DBox, EABS_3DCircle }; var EActorBracketStyle ActorBracketStyle;
// 在这里渲染这个 actor 选择 // 测试我们想要使用的渲染类型 switch (ActorBracketStyle) { case EABS_2DActorBrackets: RenderTwoDeeActorBrackets(HitActor, HUDInterface); break; case EABS_3DActorBrackets: RenderThreeDeeActorBrackets(HitActor, HUDInterface); break; case EABS_2DBox: RenderTwoDeeBox(HitActor, HUDInterface); break; case EABS_3DBox: RenderThreeDeeBox(HitActor, HUDInterface); break; case EABS_3DCircle: RenderThreeDeeCircle(HitActor, HUDInterface); break; default: break; }
相关主题
2D 边界计算
function Box GetTwoDeeActorBoundingBox(Actor Actor) { local Box ComponentsBoundingBox, OutBox; local Vector BoundingBoxCoordinates[8]; local int i; Actor.GetComponentsBoundingBox(ComponentsBoundingBox); // Z1 // X1, Y1 BoundingBoxCoordinates[0].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[0].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[0].Z = ComponentsBoundingBox.Min.Z; BoundingBoxCoordinates[0] = Canvas.Project(BoundingBoxCoordinates[0]); // X2, Y1 BoundingBoxCoordinates[1].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[1].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[1].Z = ComponentsBoundingBox.Min.Z; BoundingBoxCoordinates[1] = Canvas.Project(BoundingBoxCoordinates[1]); // X1, Y2 BoundingBoxCoordinates[2].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[2].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[2].Z = ComponentsBoundingBox.Min.Z; BoundingBoxCoordinates[2] = Canvas.Project(BoundingBoxCoordinates[2]); // X2, Y2 BoundingBoxCoordinates[3].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[3].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[3].Z = ComponentsBoundingBox.Min.Z; BoundingBoxCoordinates[3] = Canvas.Project(BoundingBoxCoordinates[3]); // Z2 // X1, Y1 BoundingBoxCoordinates[4].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[4].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[4].Z = ComponentsBoundingBox.Max.Z; BoundingBoxCoordinates[4] = Canvas.Project(BoundingBoxCoordinates[4]); // X2, Y1 BoundingBoxCoordinates[5].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[5].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[5].Z = ComponentsBoundingBox.Max.Z; BoundingBoxCoordinates[5] = Canvas.Project(BoundingBoxCoordinates[5]); // X1, Y2 BoundingBoxCoordinates[6].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[6].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[6].Z = ComponentsBoundingBox.Max.Z; BoundingBoxCoordinates[6] = Canvas.Project(BoundingBoxCoordinates[6]); // X2, Y2 BoundingBoxCoordinates[7].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[7].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[7].Z = ComponentsBoundingBox.Max.Z; BoundingBoxCoordinates[7] = Canvas.Project(BoundingBoxCoordinates[7]); // 找出左方、顶部、右方和底部坐标 OutBox.Min.X = Canvas.ClipX; OutBox.Min.Y = Canvas.ClipY; OutBox.Max.X = 0; OutBox.Max.Y = 0; // 遍历边界盒坐标 for (i = 0; i < ArrayCount(BoundingBoxCoordinates); ++i) { // 检测最小的 X 坐标 if (OutBox.Min.X > BoundingBoxCoordinates[i].X) { OutBox.Min.X = BoundingBoxCoordinates[i].X; } // 检测最小的 Y 坐标 if (OutBox.Min.Y > BoundingBoxCoordinates[i].Y) { OutBox.Min.Y = BoundingBoxCoordinates[i].Y; } // 检测最大的 X 坐标 if (OutBox.Max.X < BoundingBoxCoordinates[i].X) { OutBox.Max.X = BoundingBoxCoordinates[i].X; } // 检测最大的 Y 坐标 if (OutBox.Max.Y < BoundingBoxCoordinates[i].Y) { OutBox.Max.Y = BoundingBoxCoordinates[i].Y; } } return OutBox; }
相关主题
2D 选择框(实线框)
function RenderTwoDeeBox(Actor Actor, ASIHUDInterface HUDInterface) { local Box ActorBoundingBox; if (Canvas == None || Actor == None) { return; } ActorBoundingBox = GetTwoDeeActorBoundingBox(Actor); // 绘制 actor 框 Canvas.SetDrawColor(255, 255, 255); // 左上方位置 Canvas.SetPos(ActorBoundingBox.Min.X, ActorBoundingBox.Min.Y); // 绘制这个方框 Canvas.DrawBox ( (ActorBoundingBox.Max.X - ActorBoundingBox.Min.X), (ActorBoundingBox.Max.Y - ActorBoundingBox.Min.Y) ); }
2D 选择框(虚线框)
function RenderTwoDeeActorBrackets(Actor Actor, ASIHUDInterface HUDInterface) { local Box ActorBoundingBox; local int ActualWidth, ActualHeight; if (Canvas == None || Actor == None) { return; } ActorBoundingBox = GetTwoDeeActorBoundingBox(Actor); // 计算宽度和高度 ActualWidth = (ActorBoundingBox.Max.X - ActorBoundingBox.Min.X) * 0.3f; ActualHeight = (ActorBoundingBox.Max.Y - ActorBoundingBox.Min.Y) * 0.3f; // 绘制 actor 框 Canvas.SetDrawColor(255, 255, 255); // 左上方 Canvas.SetPos(ActorBoundingBox.Min.X, ActorBoundingBox.Min.Y); Canvas.DrawRect(ActualWidth, 2); Canvas.SetPos(ActorBoundingBox.Min.X, ActorBoundingBox.Min.Y); Canvas.DrawRect(2, ActualHeight); // 右上方 Canvas.SetPos(ActorBoundingBox.Max.X - ActualWidth - 2, ActorBoundingBox.Min.Y); Canvas.DrawRect(ActualWidth, 2); Canvas.SetPos(ActorBoundingBox.Max.X - 2, ActorBoundingBox.Min.Y); Canvas.DrawRect(2, ActualHeight); // 左下方 Canvas.SetPos(ActorBoundingBox.Min.X, ActorBoundingBox.Max.Y - 2); Canvas.DrawRect(ActualWidth, 2); Canvas.SetPos(ActorBoundingBox.Min.X, ActorBoundingBox.Max.Y - ActualHeight - 2); Canvas.DrawRect(2, Actualheight); // 右下方 Canvas.SetPos(ActorBoundingBox.Max.X - ActualWidth - 2, ActorBoundingBox.Max.Y - 2); Canvas.DrawRect(ActualWidth + 2, 2); Canvas.SetPos(ActorBoundingBox.Max.X - 2, ActorBoundingBox.Max.Y - ActualHeight - 2); Canvas.DrawRect(2, ActualHeight + 2); }
3D 选择框(实线框)
function RenderThreeDeeBox(Actor Actor, ASIHUDInterface HUDInterface) { local Box ComponentsBoundingBox; local Vector BoundingBoxCoordinates[8]; local int i; if (Actor == None) { return; } Actor.GetComponentsBoundingBox(ComponentsBoundingBox); // Z1 // X1, Y1 BoundingBoxCoordinates[0].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[0].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[0].Z = ComponentsBoundingBox.Min.Z; // X2, Y1 BoundingBoxCoordinates[1].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[1].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[1].Z = ComponentsBoundingBox.Min.Z; // X2, Y2 BoundingBoxCoordinates[2].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[2].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[2].Z = ComponentsBoundingBox.Min.Z; // X1, Y2 BoundingBoxCoordinates[3].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[3].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[3].Z = ComponentsBoundingBox.Min.Z; // Z2 // X1, Y1 BoundingBoxCoordinates[4].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[4].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[4].Z = ComponentsBoundingBox.Max.Z; // X2, Y1 BoundingBoxCoordinates[5].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[5].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[5].Z = ComponentsBoundingBox.Max.Z; // X2, Y2 BoundingBoxCoordinates[6].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[6].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[6].Z = ComponentsBoundingBox.Max.Z; // X1, Y2 BoundingBoxCoordinates[7].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[7].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[7].Z = ComponentsBoundingBox.Max.Z; for (i = 0; i < 4; ++i) { Draw3DLine(BoundingBoxCoordinates[i], BoundingBoxCoordinates[(i == 3) ? 0 : i + 1], class'HUD'.default.WhiteColor); } for (i = 4; i < 8; ++i) { Draw3DLine(BoundingBoxCoordinates[i], BoundingBoxCoordinates[(i == 7) ? 4 : i + 1], class'HUD'.default.WhiteColor); } for (i = 0; i < 4; ++i) { Draw3DLine(BoundingBoxCoordinates[i], BoundingBoxCoordinates[i + 4], class'HUD'.default.WhiteColor); } }
3D 选择框(虚线框)
function RenderThreeDeeActorBrackets(Actor Actor, ASIHUDInterface HUDInterface) { local Box ComponentsBoundingBox; local Vector BoundingBoxCoordinates[8], InnerBoxCoordinates[8]; local int i; local float f; if (Actor == None) { return; } Actor.GetComponentsBoundingBox(ComponentsBoundingBox); // Z1 // X1, Y1 BoundingBoxCoordinates[0].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[0].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[0].Z = ComponentsBoundingBox.Min.Z; // X2, Y1 BoundingBoxCoordinates[1].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[1].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[1].Z = ComponentsBoundingBox.Min.Z; // X2, Y2 BoundingBoxCoordinates[2].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[2].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[2].Z = ComponentsBoundingBox.Min.Z; // X1, Y2 BoundingBoxCoordinates[3].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[3].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[3].Z = ComponentsBoundingBox.Min.Z; // Z2 // X1, Y1 BoundingBoxCoordinates[4].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[4].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[4].Z = ComponentsBoundingBox.Max.Z; // X2, Y1 BoundingBoxCoordinates[5].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[5].Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates[5].Z = ComponentsBoundingBox.Max.Z; // X2, Y2 BoundingBoxCoordinates[6].X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates[6].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[6].Z = ComponentsBoundingBox.Max.Z; // X1, Y2 BoundingBoxCoordinates[7].X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates[7].Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates[7].Z = ComponentsBoundingBox.Max.Z; // 计算内层 X f = VSize(BoundingBoxCoordinates[4] - BoundingBoxCoordinates[5]) * 0.3f; // Z1 // X1, Y1 InnerBoxCoordinates[0].X = ComponentsBoundingBox.Min.X + f; InnerBoxCoordinates[0].Y = ComponentsBoundingBox.Min.Y; InnerBoxCoordinates[0].Z = ComponentsBoundingBox.Min.Z; // X2, Y1 InnerBoxCoordinates[1].X = ComponentsBoundingBox.Max.X - f; InnerBoxCoordinates[1].Y = ComponentsBoundingBox.Min.Y; InnerBoxCoordinates[1].Z = ComponentsBoundingBox.Min.Z; // X2, Y2 InnerBoxCoordinates[2].X = ComponentsBoundingBox.Max.X - f; InnerBoxCoordinates[2].Y = ComponentsBoundingBox.Max.Y; InnerBoxCoordinates[2].Z = ComponentsBoundingBox.Min.Z; // X1, Y2 InnerBoxCoordinates[3].X = ComponentsBoundingBox.Min.X + f; InnerBoxCoordinates[3].Y = ComponentsBoundingBox.Max.Y; InnerBoxCoordinates[3].Z = ComponentsBoundingBox.Min.Z; // Z2 // X1, Y1 InnerBoxCoordinates[4].X = ComponentsBoundingBox.Min.X + f; InnerBoxCoordinates[4].Y = ComponentsBoundingBox.Min.Y; InnerBoxCoordinates[4].Z = ComponentsBoundingBox.Max.Z; // X2, Y1 InnerBoxCoordinates[5].X = ComponentsBoundingBox.Max.X - f; InnerBoxCoordinates[5].Y = ComponentsBoundingBox.Min.Y; InnerBoxCoordinates[5].Z = ComponentsBoundingBox.Max.Z; // X2, Y2 InnerBoxCoordinates[6].X = ComponentsBoundingBox.Max.X - f; InnerBoxCoordinates[6].Y = ComponentsBoundingBox.Max.Y; InnerBoxCoordinates[6].Z = ComponentsBoundingBox.Max.Z; // X1, Y2 InnerBoxCoordinates[7].X = ComponentsBoundingBox.Min.X + f; InnerBoxCoordinates[7].Y = ComponentsBoundingBox.Max.Y; InnerBoxCoordinates[7].Z = ComponentsBoundingBox.Max.Z; for (i = 0; i < 8; ++i) { Draw3DLine(BoundingBoxCoordinates[i], InnerBoxCoordinates[i], class'HUD'.default.WhiteColor); } // 计算内层 Y f = VSize(BoundingBoxCoordinates[4] - BoundingBoxCoordinates[7]) * 0.3f; // Z1 // X1, Y1 InnerBoxCoordinates[0].X = ComponentsBoundingBox.Min.X; InnerBoxCoordinates[0].Y = ComponentsBoundingBox.Min.Y + f; InnerBoxCoordinates[0].Z = ComponentsBoundingBox.Min.Z; // X2, Y1 InnerBoxCoordinates[1].X = ComponentsBoundingBox.Max.X; InnerBoxCoordinates[1].Y = ComponentsBoundingBox.Min.Y + f; InnerBoxCoordinates[1].Z = ComponentsBoundingBox.Min.Z; // X2, Y2 InnerBoxCoordinates[2].X = ComponentsBoundingBox.Max.X; InnerBoxCoordinates[2].Y = ComponentsBoundingBox.Max.Y - f; InnerBoxCoordinates[2].Z = ComponentsBoundingBox.Min.Z; // X1, Y2 InnerBoxCoordinates[3].X = ComponentsBoundingBox.Min.X; InnerBoxCoordinates[3].Y = ComponentsBoundingBox.Max.Y - f; InnerBoxCoordinates[3].Z = ComponentsBoundingBox.Min.Z; // Z2 // X1, Y1 InnerBoxCoordinates[4].X = ComponentsBoundingBox.Min.X; InnerBoxCoordinates[4].Y = ComponentsBoundingBox.Min.Y + f; InnerBoxCoordinates[4].Z = ComponentsBoundingBox.Max.Z; // X2, Y1 InnerBoxCoordinates[5].X = ComponentsBoundingBox.Max.X; InnerBoxCoordinates[5].Y = ComponentsBoundingBox.Min.Y + f; InnerBoxCoordinates[5].Z = ComponentsBoundingBox.Max.Z; // X2, Y2 InnerBoxCoordinates[6].X = ComponentsBoundingBox.Max.X; InnerBoxCoordinates[6].Y = ComponentsBoundingBox.Max.Y - f; InnerBoxCoordinates[6].Z = ComponentsBoundingBox.Max.Z; // X1, Y2 InnerBoxCoordinates[7].X = ComponentsBoundingBox.Min.X; InnerBoxCoordinates[7].Y = ComponentsBoundingBox.Max.Y - f; InnerBoxCoordinates[7].Z = ComponentsBoundingBox.Max.Z; for (i = 0; i < 8; ++i) { Draw3DLine(BoundingBoxCoordinates[i], InnerBoxCoordinates[i], class'HUD'.default.WhiteColor); } // 计算内层 Z f = VSize(BoundingBoxCoordinates[0] - BoundingBoxCoordinates[4]) * 0.3f; // Z1 // X1, Y1 InnerBoxCoordinates[0].X = ComponentsBoundingBox.Min.X; InnerBoxCoordinates[0].Y = ComponentsBoundingBox.Min.Y; InnerBoxCoordinates[0].Z = ComponentsBoundingBox.Min.Z + f; // X2, Y1 InnerBoxCoordinates[1].X = ComponentsBoundingBox.Max.X; InnerBoxCoordinates[1].Y = ComponentsBoundingBox.Min.Y; InnerBoxCoordinates[1].Z = ComponentsBoundingBox.Min.Z + f; // X2, Y2 InnerBoxCoordinates[2].X = ComponentsBoundingBox.Max.X; InnerBoxCoordinates[2].Y = ComponentsBoundingBox.Max.Y; InnerBoxCoordinates[2].Z = ComponentsBoundingBox.Min.Z + f; // X1, Y2 InnerBoxCoordinates[3].X = ComponentsBoundingBox.Min.X; InnerBoxCoordinates[3].Y = ComponentsBoundingBox.Max.Y; InnerBoxCoordinates[3].Z = ComponentsBoundingBox.Min.Z + f; // Z2 // X1, Y1 InnerBoxCoordinates[4].X = ComponentsBoundingBox.Min.X; InnerBoxCoordinates[4].Y = ComponentsBoundingBox.Min.Y; InnerBoxCoordinates[4].Z = ComponentsBoundingBox.Max.Z - f; // X2, Y1 InnerBoxCoordinates[5].X = ComponentsBoundingBox.Max.X; InnerBoxCoordinates[5].Y = ComponentsBoundingBox.Min.Y; InnerBoxCoordinates[5].Z = ComponentsBoundingBox.Max.Z - f; // X2, Y2 InnerBoxCoordinates[6].X = ComponentsBoundingBox.Max.X; InnerBoxCoordinates[6].Y = ComponentsBoundingBox.Max.Y; InnerBoxCoordinates[6].Z = ComponentsBoundingBox.Max.Z - f; // X1, Y2 InnerBoxCoordinates[7].X = ComponentsBoundingBox.Min.X; InnerBoxCoordinates[7].Y = ComponentsBoundingBox.Max.Y; InnerBoxCoordinates[7].Z = ComponentsBoundingBox.Max.Z - f; for (i = 0; i < 8; ++i) { Draw3DLine(BoundingBoxCoordinates[i], InnerBoxCoordinates[i], class'HUD'.default.WhiteColor); } }
3D 选择圆圈
function RenderThreeDeeCircle(Actor Actor, ASIHUDInterface HUDInterface) { local Rotator Angle; local Vector Radius, Offsets[16]; local Box ComponentsBoundingBox; local float Width, Height; local int i; if (Actor == None) { return; } Actor.GetComponentsBoundingBox(ComponentsBoundingBox); Width = ComponentsBoundingBox.Max.X - ComponentsBoundingBox.Min.X; Height = ComponentsBoundingBox.Max.Y - ComponentsBoundingBox.Min.Y; Radius.X = (Width > Height) ? Width : Height; i = 0; for (Angle.Yaw = 0; Angle.Yaw < 65536; Angle.Yaw += 4096) { // 计算偏移 Offsets[i] = Actor.Location + (Radius >> Angle) + Vect(0.f, 0.f, 16.f); i++; } // 描画所有线 for (i = 0; i < ArrayCount(Offsets); ++i) { if (i == ArrayCount(Offsets) - 1) { Draw3DLine(Offsets[i], Offsets[0], class'HUD'.default.WhiteColor); } else { Draw3DLine(Offsets[i], Offsets[i + 1], class'HUD'.default.WhiteColor); } } }
测试
相关主题
下载
- 下载 unrealscript 代码。(ActorSelectionInterface.zip)