GUIDE TITLE: Kicking a Soccer Ball
ESTIMATED COMPLETION TIME: 30-40 Minutes recommended
CORE VERSION: 220.127.116.11
SUGGESTED PREREQUISITES: Lua scripting basics would help understand the provided code.
Learn how to kick a soccer ball using Abilities, Physics Objects, and Lua scripting.
EXPECT TO LEARN:
- Creating an Ability
- Creating a Static Player Equipment
- Creating a Physics Object
- Creating a Kill Zone
- Lua scripting
- Checking ability phase
- Checking trigger collision
- Broadcasting events
- Applying velocity to physics object
This tutorial was made with the help of the following Community Content:
- SOCCER SPORT COMPONENT By PiousLachance
- Gigantic SPORT Stuff Pack By varglbargl
Abilities have four phases: Cast, Execute, Recovery, and Cooldown. This project will only focus on two of them because it will signal when the player has started kicking (Cast) and when the player has finished kicking (Recovery).
Adding an Ability
The first step is to add an ability to kick with the left mouse button.
- From the Core Content window, drag an Ability object into the Hierarchy.
- Open the Properties window and set the Animation property to
- Make sure the Action Binding property is set to Primary Ability.
- Set the Cast Duration property to
- Set the Execute Duration property to
- Set the Recovery Duration property to
- Set the Cooldown Duration property to
Adding an Equipment
As of now, the ability is not attached to the player so it can't be used. Equipment allows the player to pick up the ability. From the Core Content window, drag an Equipment object into the Hierarchy. Drag and drop the Ability into the Equipment so it is a child.
Testing the Ability
The Equipment has a child named BoxTrigger. If the player collides with the trigger then it will pick up the equipment. Preview the project and collide with the equipment trigger. The player should kick when clicking the left mouse button.
The KickAbility Script
Right click the Ability and create a New Script. Rename it
Open KickAbility Script and add the following code:
local KICKABILITY = script.parent function ConnectAbilityEvents_KickBall(ability) ability.castEvent:Connect(OnCast_KickBall) ability.recoveryEvent:Connect(OnRecovery_KickBall) end function OnCast_KickBall(ability) Events.Broadcast("PlayerKickStart") end function OnRecovery_KickBall(ability) Events.Broadcast("PlayerKickFinish") end ConnectAbilityEvents_KickBall(KICKABILITY)
The script is connecting the Cast and Recovery phase of the kick ability to functions
OnRecovery_KickBall respectively. The functions are broadcasting an event. These events will be received in another script to control kicking the ball.
Static Player Equipment
Currently, the player must collide with the equipment trigger to activate the kick ability. Static Player Equipment allows the player to start with equipment already attached.
- Right click the Equipment and select Create New Template From This. Rename it
- Delete the KickEquipment object from the Hierarchy.
- From the Core Content window, drag a Static Player Equipment object into the Hierarchy.
- Open the Properties window and set the EquipmentTemplate property to KickEquipment.
Preview the project and the player should start off with the kicking ability.
Adding a Physics Object
The soccer ball will need physics and collision logic. This makes the Physics Sphere a perfect object for this project.
- From the Core Content window, drag a Physics Sphere object into the Hierarchy.
- Select the Physics Sphere and open the Properties window.
- Set the Radius property to
- Set the Angular and Linear Damping property to
- Delete the PhysicsSphereMesh inside the Physics Sphere's ClientContext group.
- From the Core Content window, search for
Ball - Soccer 01.
- Drag and drop the soccer ball mesh into the Physics Sphere's ClientContext group.
- Scale the soccer ball mesh to fit the Physics Sphere size.
Enter preview mode and check if the player can dribble with the soccer ball.
To detect if the player kicks the ball, a trigger object will need to be surrounding the ball mesh.
- Right click the Physics Sphere and add a Trigger object.
- Right click the Trigger and select Enable Networking.
- Open the Properties window and change the Shape property to a sphere.
- Transform the trigger to slightly larger than the soccer ball.
The SoccerBallKick Script
Right click the Trigger and add a new Script. Rename it
SoccerBallKick. Right click the script and select Enable Networking.
Open SoccerBallKick Script and add the following code:
local TRIGGER = script.parent local BALL = script.parent.parent local kicked = false local kickHeight = 0.5 local kickPower = 2300 function OnBeginOverlap(trigger, other) if Object.IsValid(other) and other:IsA("Player") and kicked then local forwardVector = other:GetWorldTransform():GetForwardVector() local upwardVector = Vector3.UP * kickHeight local velocity = (forwardVector + upwardVector) * kickPower BALL:SetVelocity(velocity) --Make the ball spin randomly BALL:SetAngularVelocity(Vector3.New(math.random(-720, 720), math.random(-720, 720), math.random(-720, 720))) kicked = false end end TRIGGER.beginOverlapEvent:Connect(OnBeginOverlap) function OnKickStart() kicked = true end function OnKickFinish() kicked = false end Events.Connect("PlayerKickStart", OnKickStart) Events.Connect("PlayerKickFinish", OnKickFinish)
PlayerKickFinish broadcasted events from the KickAbility script are toggling the
kicked boolean variable. If the player overlaps the soccer ball trigger and
kicked is true, then the ball's velocity is calculated using the player's forward vector,
kickHeight variable, and
Play the project in Preview Mode. The player should be able to kick the ball much farther than a dribble.
Adding a Kill Zone
One current issue is the player and ball are lost in the void once they leave the Ground Floor. To fix this, a Kill Zone object can be added with some Lua scripting to respawn the player and ball.
- From the Core Content window, drag and drop a Kill Zone object into the Hierarchy.
- Select the Kill Trigger and open the Properties window.
- Set the Position Z property to
- Set the Scale X and Y properties to
The player should now die when it falls off the Ground Floor.
Adding Spawn Settings
Spawn Settings will send the player back to a Spawn Point once they die.
- From the Core Content window, drag and drop a Spawn Settings object into the Gameplay Settings group.
- Select the Spawn Settings and open the Properties window.
- Change the Respawn Delay property to
The player should now respawn on the Ground Floor three seconds after it dies.
The SoccerBallReset Script
Right click the Physics Sphere and add a new script. Rename it
SoccerBallReset. Right click the script and select Enable Networking.
Open SoccerBallReset Script and add the following code:
local BALL = script.parent local startingPostion = BALL:GetWorldPosition() function Reset() Task.Wait(1) BALL:SetWorldPosition(startingPostion) BALL:SetVelocity(Vector3.ZERO) BALL:SetAngularVelocity(Vector3.ZERO) end Events.Connect("ResetBall", Reset)
The script is waiting for a
ResetBall event to be broadcasted. The event calls the
Reset function which spawns the ball at the starting position.
The KillZoneServer Script
The Kill Zone group has a child script named KillZoneServer.
Open the KillZoneServer script and replace the contents with the following code:
local KILL_TRIGGER = script:GetCustomProperty("KillTrigger"):WaitForObject() function OnBeginOverlap(trigger, other) if other:IsA("Player") then other:Die() end local soccerBall = World.FindObjectByName("Physics Sphere") if soccerBall.id == other.id then Events.Broadcast("ResetBall") end end KILL_TRIGGER.beginOverlapEvent:Connect(OnBeginOverlap)
The script searches the Hierarchy for an object with the name
Physics Sphere and broadcasts the
ResetBall event if the object collides with the Kill Zone trigger.
Play the project and see if the player and ball both respawn when they collide with the Kill Zone.
This will be the ending point for this tutorial on making a kick ability and a kickable physics object. It's a starting off point to numerous game ideas involving soccer.
Leave a comment if you have any feedback.