本人最近几天一直想写一个赛道构建的例子,一下使用UnrealReal4中spline,splinemesh组件。具体怎么用大家去看官方的wiki就行了,这里直接贴代码`。

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "RoadSpline.generated.h"class USplineComponent;
class USplineMeshComponent;
class UTextRenderComponent;USTRUCT()
struct FSplineRoadData
{GENERATED_USTRUCT_BODY()UPROPERTY( )bool    LeftGuardRail;UPROPERTY()bool    RightGuardRail;UPROPERTY( )float   TrackBank;UPROPERTY( )float   TrackWidth;UPROPERTY( )float   TrackThickness;FSplineRoadData(): LeftGuardRail(true), RightGuardRail(true), TrackBank(0.0f), TrackWidth(1.0f), TrackThickness(1.0f){}
};UCLASS()
class RACER_API ARoadSpline : public AActor
{GENERATED_BODY()public: // Sets default values for this actor's propertiesARoadSpline();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public: // Called every framevirtual void Tick(float DeltaTime) override;virtual void OnConstruction(const FTransform& Transform);USplineMeshComponent* AddTrackElement(int index,UStaticMesh* mesh);virtual void UpdateSplineMesh(TArray<USplineMeshComponent*>& splineArray);virtual UTextRenderComponent* DrawTrackNumber( int index );
public:UPROPERTY(EditDefaultsOnly, Category = "Road Components")USplineComponent* mSplineComponent;UPROPERTY( )int NumberOfSplinePoints;UPROPERTY( )TArray<FSplineRoadData> RoadDataArray;UPROPERTY( )TArray<USplineMeshComponent*> SplineMeshArray;UPROPERTY( )TArray<USplineMeshComponent*> LeftSplineMeshArray;UPROPERTY( )TArray<USplineMeshComponent*> RightSplineMeshArray;UPROPERTY( )TArray<UTextRenderComponent*> textArray;UPROPERTY(EditDefaultsOnly, Category = "LoopRoad")bool    LoopingTrack; // 是否循环,貌似现在不可用UPROPERTY()int    mCurrentIndex; // 当前编辑第几个UPROPERTY()int    mPointIndex; // 当前编辑第几个UPROPERTY(transient)class UStaticMesh* CameraMesh;UPROPERTY(transient)class UStaticMesh* rightMesh;UPROPERTY(transient)class UStaticMesh* leftMesh;UPROPERTY( EditDefaultsOnly, Category = "Collision" )bool Collisions; // 是否支持碰撞};

一下是实现:

// Fill out your copyright notice in the Description page of Project Settings.#include "RoadSpline.h"
#include "Components/SplineComponent.h"
#include "Components/SplineMeshComponent.h"
#include "Components/TextRenderComponent.h"
#include "Engine/CollisionProfile.h"
#include "UObject/ConstructorHelpers.h"// Sets default values
ARoadSpline::ARoadSpline()
: Collisions(false)
, mPointIndex(0)
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;mSplineComponent = CreateDefaultSubobject<USplineComponent>(TEXT("RoadSpline"));mSplineComponent->SetupAttachment(RootComponent);
//    SetRootComponent(mSplineComponent);{static ConstructorHelpers::FObjectFinder<UStaticMesh> ObjMesh(TEXT("StaticMesh'/Game/TrackGenerator/Props/RoadMesh.RoadMesh'"));CameraMesh = ObjMesh.Object;}{static ConstructorHelpers::FObjectFinder<UStaticMesh> ObjMesh(TEXT("StaticMesh'/Game/TrackGenerator/Props/L_GuardRail.L_GuardRail'"));leftMesh = ObjMesh.Object;}{static ConstructorHelpers::FObjectFinder<UStaticMesh> ObjMesh(TEXT("StaticMesh'/Game/TrackGenerator/Props/R_GuardRail.R_GuardRail'"));rightMesh = ObjMesh.Object;}NumberOfSplinePoints = 0;mCurrentIndex = 0;}// Called when the game starts or when spawned
void ARoadSpline::BeginPlay()
{Super::BeginPlay();}// Called every frame
void ARoadSpline::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}void ARoadSpline::OnConstruction(const FTransform &Transform)
{if (mSplineComponent == NULL) {return ;}NumberOfSplinePoints = mSplineComponent->GetNumberOfSplinePoints();int RoadDataNum = RoadDataArray.Num() ;if (RoadDataNum < NumberOfSplinePoints) {int addNum = NumberOfSplinePoints - RoadDataNum;for (int i =0 ; i<addNum; i++) {FSplineRoadData item;RoadDataArray.Add( item );}}else if( RoadDataNum > NumberOfSplinePoints ){int subNum = NumberOfSplinePoints - RoadDataNum;for (int i =0 ; i<subNum; i++) {RoadDataArray.Pop();}}int lastIndex = LoopingTrack ? NumberOfSplinePoints - 1 : NumberOfSplinePoints - 2;for ( ; mCurrentIndex <= lastIndex; mCurrentIndex++){FSplineRoadData road_item = RoadDataArray[mCurrentIndex];if (road_item.RightGuardRail){USplineMeshComponent* splineMeshCom = AddTrackElement(mCurrentIndex, rightMesh);RightSplineMeshArray.Add(splineMeshCom);}if (road_item.LeftGuardRail){USplineMeshComponent* splineMeshCom = AddTrackElement(mCurrentIndex, leftMesh);LeftSplineMeshArray.Add(splineMeshCom);}{
//            GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("list"));USplineMeshComponent* splineMeshCom = AddTrackElement(mCurrentIndex, CameraMesh);SplineMeshArray.Add(splineMeshCom);}}for (; mPointIndex < NumberOfSplinePoints ; mPointIndex ++){
//        GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("point"));UTextRenderComponent* renderCom = DrawTrackNumber( mPointIndex );textArray.Add( renderCom );}for (int i = 0 ; i< textArray.Num(); i++){UTextRenderComponent* renderCom = textArray[i];if (renderCom) {FVector LocalPosition,LocalTangent;mSplineComponent->GetLocalLocationAndTangentAtSplinePoint(i,LocalPosition,LocalTangent);LocalPosition.Z += 100;FVector Scale3D(1.0,1.0,1.0);LocalTangent *= -1;FRotator rotator = LocalTangent.Rotation();FTransform tranform( rotator,LocalPosition,Scale3D );renderCom->SetRelativeTransform(tranform);}}UpdateSplineMesh(SplineMeshArray);UpdateSplineMesh(LeftSplineMeshArray);UpdateSplineMesh(RightSplineMeshArray);}void ARoadSpline::UpdateSplineMesh(TArray<USplineMeshComponent*>& splineArray)
{for (int i =0 ; i<splineArray.Num(); i++) {USplineMeshComponent* segment = splineArray[i];if (segment) {FVector LocalStartPosition,LoccalStartTangent,LocalEndPosition,LocalEndTangent;mSplineComponent->GetLocalLocationAndTangentAtSplinePoint(i,LocalStartPosition,LoccalStartTangent);mSplineComponent->GetLocalLocationAndTangentAtSplinePoint(i+1, LocalEndPosition,LocalEndTangent);segment->SetStartAndEnd(LocalStartPosition, LoccalStartTangent,LocalEndPosition, LocalEndTangent);}}
}USplineMeshComponent* ARoadSpline::AddTrackElement(int index, UStaticMesh *mesh)
{UStaticMesh* LocalTrackElementMesh = mesh;int LocalCurrentTrackPoint = index;int LocalNextTrackPoint = ( index + 1 ) % NumberOfSplinePoints;FString text = FString::Printf(TEXT("%d,%d"),LocalCurrentTrackPoint,LocalNextTrackPoint);GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, text);FSplineRoadData roadItem = RoadDataArray[LocalCurrentTrackPoint];FSplineRoadData nextRoadItem = RoadDataArray[LocalNextTrackPoint];int LocalStartRoll = roadItem.TrackBank;int LocalEndRoll = nextRoadItem.TrackBank;FVector2D LocalEndScale(nextRoadItem.TrackWidth,nextRoadItem.TrackThickness);FVector2D LocalStartScale(roadItem.TrackWidth,roadItem.TrackThickness);USplineMeshComponent* const Segment = NewObject<USplineMeshComponent>(this);if (Segment){
//      GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("add"));Segment->SetStaticMesh(LocalTrackElementMesh);Segment->SetStartRoll(LocalStartRoll,true);Segment->SetEndRoll(LocalEndRoll);Segment->SetStartScale(LocalStartScale);Segment->SetEndScale(LocalEndScale);Segment->SetMobility(EComponentMobility::Stationary);if ( Collisions)Segment->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);elseSegment->SetCollisionEnabled(ECollisionEnabled::NoCollision);Segment->SetForwardAxis(ESplineMeshAxis::X);Segment->SetupAttachment( RootComponent );Segment->RegisterComponent();return Segment;}return NULL;
}UTextRenderComponent* ARoadSpline::DrawTrackNumber(int index)
{FString indexStr = FString::Printf( TEXT( "%d" ),index);FText TestHUDText = FText::FromString(indexStr);UTextRenderComponent* renderCom = NewObject<UTextRenderComponent>(this);if ( renderCom ) {renderCom->SetupAttachment( RootComponent );renderCom->RegisterComponent( );renderCom->SetText( TestHUDText );return renderCom;}return NULL;}

Unreal4 使用spline , splinemesh组件构建赛道小例子相关推荐

  1. php 小程序轮播图,微信小程序swiper组件构建轮播图代码分享

    本文主要和大家介绍微信小程序 swiper组件构建轮播图的实例的相关资料,如有疑问请留言或者到本站社区交流讨论,需要的朋友可以参考下,希望能帮助到大家. 微信小程序 swiper组件构建轮播图的实例 ...

  2. react 组件构建_使用React Spring和Tinycolor构建色彩丰富的弹性组件

    react 组件构建 Recently, I decided to build a web application to allow designers and developers to gener ...

  3. Lin-UI Grid组件 构建六宫格

    Lin-UI Grid 组件 构建六宫格 Lin-UI官网资料 引入Lin-UI组件 因为没有经过引入的Lin-UI组件是不能使用的,所以必须要在json文件中引入,但是一个组件在一个文件中需要使用就 ...

  4. vant 项目_如何搭建mpvue框架搭配vant组件库的小程序项目

    1. vant 介绍 ### 扫码体验 Vant - 轻量.可靠的移动端 Vue 小程序 组件库.由有赞公司开发与维护.提供了一系列美观.优质的移动端组件. vant 官网 2. 在普通小程序怎么使用 ...

  5. Docker多步构建更小的Java镜像

    译者按: 最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就可以定义多个中间镜像用于构建,测试以及发布等多个步骤,并且有效减小最终镜像的大小. ...

  6. 10分钟上线 - 利用函数计算构建微信小程序的Server端

    摘要: 阿里云函数计算是一个事件驱动的全托管计算服务.通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传.微信小程序是一种不需要下载安装即可使用的应用,它可以在微信内被便捷地获取和传播. 当 ...

  7. amazeui学习笔记--css(常用组件1)--小徽章Badge

    amazeui学习笔记--css(常用组件1)--小徽章Badge 一.总结 1.am-badge:添加am-badge来声明小徽章对象 <span class="am-badge a ...

  8. react 组件构建_让我们用100行JavaScript构建一个React Chat Room组件

    react 组件构建 by Kevin Hsu 通过徐凯文 让我们用100行JavaScript构建一个React Chat Room组件 (Let's Build a React Chat Room ...

  9. Flask+Axios+jQuery构建前后端通信的小例子

    比较暴力但好理解的方法,下面详细说一下. 工具准备 Flask pip install flask Axios https://cdnjs.cloudflare.com/ajax/libs/axios ...

最新文章

  1. ffmpeg php 快速播放,怎么在PHP中利用FFmpeg函数对视频播放的时长进行获取
  2. mysql修改binlog格式_mysql binlog格式...
  3. python哪本好-最好的Python入门教材是哪本?
  4. 开源 免费 java CMS - FreeCMS1.7 栏目管理
  5. scrapy 工作流程
  6. 【蓝桥杯每日一练】 斐波那契数列
  7. bzoj 3172: [Tjoi2013]单词 AC自动机
  8. Windows系统中使用SSH服务端和客户端
  9. Dart基础第6篇:集合类型List Set Map详解 以及循环语句 forEach map where any every
  10. 【UVA12230】Crossing Rivers(概率/期望)
  11. 游戏测试----------------第4章
  12. 安卓手机权限总结安卓权限列表
  13. Python中使用snip问题
  14. 网络安全攻击与防护--HTML学习
  15. 浅谈Unity中的rotation和Quaternion的乘法
  16. 【人工智能】从数据预处理到排序算法,全方位解读 Uber 人工智能客服 COTA
  17. C++指向const对象的指针和const指针
  18. Linux TC 流量控制与排队规则 qdisc 树型结构详解(以HTB和RED为例)
  19. Prometheus节点失联后CPU使用率不准确
  20. Tornado:使用RabbitMQ发布消息(pika:pika.adapters.tornado_connection.TornadoConnection)

热门文章

  1. uniapp 实现微信小程序全局分享及自定义分享按钮样式
  2. 但愿人长久,千里共婵娟---众智云
  3. ISM无需授权使用的无线频率
  4. sqlserver 联接查询的一些注意点
  5. 怎样申请MAC地址?
  6. Go语言学习之路(二)
  7. 对路径“c:\inetpub\wwwroot\yuanxiaofenlei.html”的访问被拒绝。
  8. Android 使用 Scroller 实现平滑滚动
  9. python句柄无效_作为Windows服务运行的Python:OSError:[WinError 6]句柄无效
  10. 手机拍证件照的工具哪个好用