UE4 ProjectileMovement Component 延遲啟動

天才寶藏發表於2020-10-27

遇到的問題是,對於投擲的物品,剛開始拿在手上(不發射出去),發射出去時根據調整的角度發射。
但是ProjectileMovement Component 中發射引數 Initial Speed 和velocity引數只能初始化的時候設定,再後期動態改時沒有作用的。

看了ProjectileMovement Component 中的原始碼發現


void UProjectileMovementComponent::InitializeComponent()
{
	Super::InitializeComponent();

	if (Velocity.SizeSquared() > 0.f)
	{
		// InitialSpeed > 0 overrides initial velocity magnitude.
		if (InitialSpeed > 0.f)
		{
			Velocity = Velocity.GetSafeNormal() * InitialSpeed;///初始化速度
		}

		if (bInitialVelocityInLocalSpace)
		{
			SetVelocityInLocalSpace(Velocity);
		}
  
  ………………
  }
  void UProjectileMovementComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
{
    while (bSimulationEnabled && RemainingTime >= MIN_TICK_TIME && (Iterations < MaxSimulationIterations) && !ActorOwner->IsPendingKill() && !HasStoppedSimulation())
	{
		LoopCount++;
		Iterations++;

		// subdivide long ticks to more closely follow parabolic trajectory
		const float InitialTimeRemaining = RemainingTime;
		const float TimeTick = ShouldUseSubStepping() ? GetSimulationTimeStep(RemainingTime, Iterations) : RemainingTime;
		RemainingTime -= TimeTick;
		
            ……

		// Initial move state
		Hit.Time = 1.f;
		const FVector OldVelocity = Velocity;//初始化時的Velocity值
		const FVector MoveDelta = ComputeMoveDelta(OldVelocity, TimeTick);//每幀移動的Delta
    	………………
    }
  ………………
  }

 

發現控制每幀移動的話 需要幾個判斷條件,其中bSimulationEnabled需要為True。看原始碼可以知道這個值在藍圖中可以設定的。

/**
	 * If true, does normal simulation ticking and update. If false, simulation is halted, but component will still tick (allowing interpolation to run).
	 */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=ProjectileSimulation)
	uint8 bSimulationEnabled:1;

而移動速度Velocity除了可以初始化的時候根據Speed和Velocity初始化,在藍圖中也可以動態設定的(是在UMovement component中的一個引數)

/** Current velocity of updated component. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Velocity)
	FVector Velocity;

在這裡插入圖片描述

相關文章