79 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local FVector = import "Vector"
 | |
| local FVector2D = import "Vector2D"
 | |
| local Reactive = require "Core.Reactive"
 | |
| local BusyActorManagerSubSystem = import("BusyActorManagerSubSystem")
 | |
| 
 | |
| 
 | |
| local Movement = {
 | |
|     proxy = {},
 | |
| }
 | |
| 
 | |
| function Movement:ReceiveComponentBeginPlay()
 | |
|     self.proxy = Reactive.ReactiveProperty({
 | |
|         isIdle = true,
 | |
|         direction = {X = 0, Y = 0},
 | |
|         destination = {X = 0, Y = 0}
 | |
|     })
 | |
| end
 | |
| 
 | |
| function Movement:ReceiveComponentTick(delta_time)
 | |
|     local proxy = self.proxy
 | |
|     if proxy.isIdle then return end
 | |
|     local new_pos = FVector()
 | |
|     local owner = self:GetOwner()
 | |
|     local curr_pos = owner:K2_GetActorLocation()
 | |
|     new_pos.Z = curr_pos.Z
 | |
| 
 | |
|     local move_distance = delta_time * owner:GetSpeed()
 | |
|     local distance_x = proxy.destination.X - curr_pos.X
 | |
|     local distance_y = proxy.destination.Y - curr_pos.Y
 | |
| 
 | |
|     if move_distance^2 >= distance_x^2 + distance_y^2 then
 | |
|         proxy.isIdle = true
 | |
|         new_pos.X = proxy.destination.X
 | |
|         new_pos.Y = proxy.destination.Y
 | |
|         proxy.direction = FVector2D()
 | |
|     else
 | |
|         new_pos.X = curr_pos.X + proxy.direction.X * move_distance
 | |
|         new_pos.Y = curr_pos.Y + proxy.direction.Y * move_distance
 | |
|     end
 | |
|     owner:K2_SetActorLocation(new_pos, true, nil, false)
 | |
| end
 | |
| 
 | |
| 
 | |
| 
 | |
| function Movement:SetDestination(x, y)
 | |
|     local direction = FVector2D()
 | |
|     local destination = FVector2D()
 | |
| 
 | |
|     local owner = self:GetOwner()
 | |
|     local curr_pos = owner:K2_GetActorLocation()
 | |
|     local delta_x = x - curr_pos.X
 | |
|     local delta_y = y - curr_pos.Y
 | |
|     -- 计算方向向量
 | |
|     local length = math.sqrt(delta_x ^ 2 + delta_y ^ 2)
 | |
|     if length > 0 then
 | |
|         direction.X, direction.Y = delta_x / length, delta_y / length
 | |
|     else
 | |
|         direction.X, direction.Y = 0, 0
 | |
|     end
 | |
|     destination.X , destination.Y = x, y
 | |
| 
 | |
|     self.proxy.isIdle = false
 | |
|     self.proxy.direction = direction
 | |
|     self.proxy.destination = destination
 | |
| end
 | |
| 
 | |
| function Movement:Stop()
 | |
|     self.proxy.isIdle = true
 | |
| end
 | |
| 
 | |
| function Movement:BackBonfire()
 | |
|     local sub_system = BusyActorManagerSubSystem.Get(self)
 | |
|     local bonfire = sub_system:GetNearestBonfire()
 | |
|     local position = bonfire:K2_GetActorLocation()
 | |
|     self:SetDestination(position.X, position.Y)
 | |
| end
 | |
| 
 | |
| return Class(nil, nil, Movement)
 |