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)
							 |