Releases: ramokz/phantom-camera
v0.7.0.2
v0.7.0.1
v0.7
❗ Breaking Changes
Note
The breaking changes in this release are a one-time thing.
It's a combined number of system changes that needed to happen at some point, and so it was decided to do it in one go rather than over the course of multiple releases.
Important
Always be sure to have your current changes commited to source control before updating to avoid losing work.
Godot 4.2 Minimum Requirement
This release, specifically the property change, further down the page, relies on changes that were only released in Godot 4.2. As such, it will now only be compatible with that and future versions of Godot.
Addon Filename Consolidation & Dependency Errors
A lot of the addon's filenames have been changed to align with a general snake_case naming convention, but as a result will likely run into an error on start-up that looks like this:
If you're well-versed with Godot, then this should be a relatively simple thing to resolve, but if you're unsure how to solve this, follow the steps below.
Tip
After doing the steps below, if you're running into an issue where the editor will constantly say that it can't find Phantom Camera scripts, then it's likely due to there being a cached reference to the previous file inside .godot
directory. To solve that, try and delete the entire .godot
directory. It will be repopulate itself once you reopen the project.
Fixing Missing Dependencies
Revamped Property System
This is mainly an under-the-hood change and will only impact existing users of the addon.
TLDR
- All the property variables have changed from using
_property_list
to@export
. - For existing users, a lot of property names have changed as a result, which will break, or more precisely reset, existing setups.
- See the end of the section for a mitigation guide.
Why the change?
The shift to @export
was always planned, but for a later release — initial thinking was for v1.0. The reason it is being introduced now is due to a project export bug (#164), where an important feature didn't consistently work when exporting a project — despite working consistently in the editor. Suffice to say, that's a pretty big problem. From some initial tests, this issue did not occur when using the aforementioned @export
approach. So the decision was made to make the jump sooner than originally planned. So far, the issue has yet to reappear.
The change was also meant to coincide with a better editor experience, as @export
allows for supporting inspector property tooltips (#55) as well as an in-editor documentation page for all the addon's public node properties, functions, and signals (#168).
From a development perspective, the change also greatly simplifies the process of adding, removing and debugging properties, which in turn reduces the code complexity and time spent testing new and old features.
Why was @export not used from the beginning?
The addon has been in the worked since before Godot 4 was fully released. Not until Godot 4.2 was it possible to dynamically show or hide properties using @export
. If the addon had used @export
from the start, it would have resulted in all the available properties for a given addon node always being displayed. The vast majority of which being both irrelevant and confusing without contextual toggles or modes enabled — awful developer experience, in other words.
One of the changes made here is that property names do not have any nested names, e.g. follow_parameters/target_offset
, are now named as a single variable name, e.g. follow_offset
.
I have set up a lot already from previous release(s), what can I do to mitigate breaking changes?
Assuming you're using some form of source control, such as Git, the good news is that you can convert the property names manually from the individual scene files (.tscn
) directly and keep your existing property values. Below is an example of how I would migrate an existing setup from a pre-0.7 project to be using the new property names from this release. Note that the follow_damping_value
property is the exception to this - more in the Important section below.
Mitigation Guide
Once you've updated the addon and opened an existing scene that has PCam2D
and PCam3D
nodes, their values will have reset - you may have to re-save the scene first. From here, if you want to keep your existing setup, you can look at your source control and compare what values have been changed. In the example below, I've readded a follow_target
and damping
with random values.
As the image above shows, the names are not changed to be unrecognisable from the previous version. They are different, however, which does mean manual intervention if you wish to migrate the values over. Simply use your text editor of choice and add the values into the .tscn
file directly.
Tip
If you're unsure what a property name is called now I would suggest looking it up on the documentation site. It will have all the up-to-date names.
Important
As you may have noticed from the image above, some values have had their type changed in this release too. The only properties this relates to is follow_famping_value
. You need to adjust its value according to the new system — see the Improved Follow Damping Logic section further down the page for more info. As the effect of the value have, for all intents and purposes, completed shifted I would recommend doing a test in one scene, feel it out, and reapply values elsewhere based on that observation.
Logic Moved to _process
This might seem insignificant, but it does have a notable impact.
It will likely affect everyone, existing as well as new addon users, so would suggest following the steps in the “What can I do about it?” section further down for how to work with this change.
TLDR
- By default, setting a camera to follow a physics-based node will highly likely result in the followed node being very jittery.
- Again, see “What can I do about it?” section.
- Nodes that are moving in the
_process
or uses aTween
animation should no longer be jittery. - This isn't a complete solution and there is still work to be done.
A big thanks to @P5ina (for the PR) and @Lasuch69 for the discussing and helping with this change.
What was it before?
In previous releases, camera movement has been happening in the _physics_process
. This was initially in large part been due to playable characters, what the camera would also typically be assigned to follow, would be a physics-based node such as CharacterBody2D/3D
. This meant that as the physics object moved, along with the character asset within the physics object (i.e. sprite / 3D model), the camera followed it relatively evenly as the movement should both be happening in the _physics_process
.
Why has this changed?
While having the camera move in the _physics_process
meant that following a physic-based node was generally fairly smooth, it did also come with a few, no-trivial, issues.
The arguably biggest issue, was that animations that were being done in the _process
, such as anything using the built-in Tween
method, would always result in jitter. Either when it was being followed by the camera or were moving while the camera followed something else. Since not everything is, nor should, be moving in _physics_process
it highlighted an issue with the previous approach. As things stood, it was deemed not possible to solve while the camera moved in the _physics_process
and so it was changed to be occurring in the _process
instead.
Why is there suddenly more jitter, or jitter where there was none before?
If you're using a physics object as a follow or look at target, and it's set to move in the _physics_process
then you will likely notice jitter right away — even if you apply follow damping
.
A typical playable character would then often consistent of a node hierarchy like:
CharacterBody2D/3D
- Visual representation, e.g.
Sprite2D
or a `MeshInstanc...
- Visual representation, e.g.
v0.6.4
✨ New Features
Editor Updater Confirmation Step
As the addon gets more refined over time, leading to potential breaking changes, the updater now requires an extra step to be completed before it can be triggered for major or minor releases. The only practical difference is an added dropdown menu, where you have to select Yes
instead of the default No
option, which will then make the update button appear. This is to give a bit of friction and to give some thought before pressing the big green Update button and risk causing project side effects.
This will, however, not occur for patch or hotfix releases.
Major and Minor Releases | Patch & Hotfix Releases |
Term Reference Examples:
Major Release:
v0.8
->v1.0
Minor Release:v0.6
->v0.7
Patch Release:v0.6.4
->v0.6.5
Hot Fix Release:v0.6.4
->v0.6.4.1
Editor Updater Project Settings
Tip
You may have to enable Advanced Settings
in the top right-hand corner for the settings to appear in the panel. Alternatively, you can search for them.
Options to now disable the updater to two different levels (more below) have been added to the Project Settings
.
This is meant to better support released projects where no further work is happening, but where the project is occasionally being opened.
💡 Thanks to @lunarcloud for the suggestion (#203)
🛠️ Changes & Improvements
- Added support for rotational tweening in 2D scenes. (#225)
- 💡 Thanks to ZT2wo for the suggestion. (#214)
🐛 Fixes
- Resolved an issue where moving between multiple
Framed Follow
PCams would stack the dead zone fields in the viewport. (#226)- 🔍 Thanks @RichardStolp for the report (#208)
- Resolved an issue with setting various
SpringArm3D
properties such ascollision_mask
didn't get triggered during runtime. (#224)- 🔍 Thanks @eliaskowitz for the report (#222)
v0.6.3
🛠️ Changes & Improvements
- Added
follow_target_changed
signal that's emitted whenever aPCam
's follow target is changed.- 🏅 Thanks @ZenithStar for the pull-request. (#191)
- Added
Look At Offset
option forLook At Group
.- 🏅 Thanks @ZenithStar for the pull-request. (#197)
v0.6.2.2
🐛 Fixes
- Resolved an issue where a crash could occur when you
queue_free()
a PCam node due to an invalid reference to thePCamHost
node. (#175) - Resolved an issue where changing the
Camera3D
resource properties via aPCam3D's
setter methods wouldn't update theCamera3D
if aPCam
was the active one. (#184)- 🔍 Thanks @Zaphodious for reporting this. (#183)
- Resolved an issue where Look At (for
PCam3D
) didn't assign its target properly. (#182)
v0.6.2.1
🐛 Fixes
- Resolved an issue where if you used a
Third Person Follow
PCam3D
with bothdamping
enabled, with a smalldamping value
, and afollow target
far away from a global position of (0, 0, 0) the camera would very slowly move towards its intended position from (0, 0, 0). Leading to a potentially long wait before you could realistically make use of the camera's intended behaviour. (#167)- 🔍 Thanks @MartinFretigne for spotting and reporting this. (#166)
v0.6.2
🛠️ Changes & Improvements
- Improved the ability to seamlessly transition between areas a
Limit
applies. The previous version had an issue where there would be a quirky jump as you transition between neighbouringLimit
areas. As a result from this change, the 2D damping logic has been reverted to pre-0.6, which means the damping applies an interpolation to the movement, rather than relying on theCamera2D's
Position Smoothing. Like the previous change, this shouldn't have any notable impact. - Added
is_tweening
signal — emitted whenever aPCam
is tweening. - Allow for adjusting
Follow Properties
in the node inspector, such asFollow Offset
andDamping
, even without aFollow Target
whenever theFollow Mode
is not set toNone
. This is to allow for dynamically applying aFollow Target
during runtime while allowing to setFollow Properties
if they're known during compilation and not being forced to do so via code. - Added a few missing
void
return types to various functions. - Added a default value to
Follow Target
. Allows for resetting the property using the reset button to the left of the property button. - Added a type to the 2D and 3D
Follow Target
andFollow Path Target
. It means that the pop-up menu selector only allows for selectingNode2D
/Node3D
andPath2D
/Path3D
nodes, respectively. - Removed unused icons.
🐛 Fixes
- Resolved an issue where the
Camera2D
Limit
size wouldn't reset properly while tweening betweenPCam2D
's if both were using aCollisionShape2D
as their limiter. Resulting in the camera snapping in one direction. - Resolved a regression with the
Frame Preview
not updating in 2D scenes when changing theZoom
property. This was due to a bug where the variable namezoom
inPhantomCamera2D.gd
didn't trigger the setter, and consequently the_draw
function call, resulting in the preview not updating. The fix here was to rename the variable tocamera_zoom
instead. - Resolved an issue where loading a 2D scene where a Limit was being applied via either a
TileMap
orCollisionShape2D
(Shape2D
) would result in aPCam2D
not being able to fetch the node, resulting in updates to theLimit Node
not updating thePCam2D
limit. The solution was to wait until thePCam2D
had called its_ready()
function before validating theLimit Path
property when the scene is loaded. - Resolved an issue where tweens would transition for one additional frame for every transition.
- Resolved an issue when downloading and loading the addon where either errors or a crash would occur. This was due to
scale_with_editor_scale
was enabled on some .svg icons, which scaled them to look correct on high resolution monitors. This issue should be resolved in Godot 4.3, but until then this property will be disabled to avoid user frustration.
v0.6.1
✨ New Features
Pixel Perfect (2D)
To support pixel perfect camera movement, a new toggle option to snap Camera2D
to whole pixels has been added.
This should be particularly useful in pixel art projects, where assets should always be aligned to the monitor's pixels to avoid unintended stretching.
- 🥇 Thanks to @GrogsyShovel for the contribution (#156, before/after examples can be found in the PR's description).
CollisionShape2D Limit Support
In addition to allowing TileMaps
to apply the Camera2D Limit
, a CollisionShape2D
can also be used to apply the Limit
values using its Shape2D
property. It will automatically update the limit when the Shape2D
is changed.
PhantomCamera Signals
Support for PCam
signals have been added. This is meant to allow for receiving callbacks when specific events begins or ends for each PCam
. This has been added for both PCam2D
and Pcam3D
nodes.
List of added signals:
became_active
- Emitted when thePCam
becomes active.became_inactive
- Emitted when thePCam
becomes inactive.tween_started
- Emitted when theCamera
starts to tween to thePCam
.tween_interrupted(PhantomCamera pcam)
- Emitted when the tween is interrupted due to anotherPCam
becoming active.tween_completed
- Emitted when theCamera
has completed its tween to thePCam
.
⚠️ Breaking Changes
- Property name, such as the
TileMap Limit
, has been renamed with a genericNode Limit
property - the same goes for setter/getter methods. As a result, existing property values will likely reset upon loading scenes that have any overrides, and setter/getter calls will produce errors if used in scripts until renamed to the new ones.
This change is to allow other node types to be assigned to the property, such as the newly addedCollisionShape2D
, but also to make the names less specific and more in line with other property names.- The property value loss can be mitigated by manually updating property values in the
.tscn
files in a text editor.
- The property value loss can be mitigated by manually updating property values in the
🛠️ Changes & Improvements
- Added the ability to reset most properties to a default value. This has not been applied to every property, such as
Follow Mode
, to avoid accidentally resetting critical property values. TileMap Limit
nodes will now update theLimit
size after theTileSet
is changed. Note: This will only be triggered after leaving theTileMap
editor panel.- Updated
TileMap Limit Margin
to typeVector4i
instead ofVector4
. Changed due toCamera2D
Limit
property only supports integer values. - Moved
Zoom
property fromphantom_camera_properties.gd
tophantom_camera_2D.gd
. Changed due to theZoom
property is only used in 2D scenes andPCam2D
. - Updated and organized all the addon scripts by grouping each category, i.e.
const
,vars
,func
etc., into their own, collapsable, regions.
🐛 Fixes
- Resolved an issue where
Framed Follow
in 3D scenes would not apply its distance and offset upon loading a scene. Resulting in the camera zooming into its target and effectively breaking on load. - Resolved an issue where tweening between
PCam2Ds
while the initialPCam2D
'sFollow Damping
were enabled led to undesired transition easings and sudden camera jumps at the end of the tween. - Resolved an issue where using the getter method for Limit only returned
Limit Left
.
⚕️ New Contributors
v0.6
✨ New Features
Editor Updater
Whenever a new update of Phantom Camera is released on GitHub, the editor will show a prompt to update to the latest version directly from the editor.
Code and layout for this feature was replicated from the Dialogue Manager addon by @nathanhoad.
Camera2D Limit + TileMap support
Utilizing the built-in Limit
properties of Camera2D
nodes, you can now limit the position of the camera to a specified area. Optionally, it also supports the built-in smoothing property. So whenever the edge of the limit is reached it will gradually ease to its limit, as opposed to immediately stop once it reaches the edge.
On top of the existing built-in feature set, TileMap
node can also optionally be used as a way to limit the Camera2D
movement. An optional margin can also be set to further adjust the limit's size.
The editor preview area of the clamped area can be toggled within the editor.
Example Scene
addons/phantom_camera/examples/example_scenes/2D/2DLimitExampleScene.tscn
- Thanks @ManicMarrc for the initial Tile Map clamp suggestion #109
- Thanks @spheras for the additional suggestion of supporting
Camera2D
Limit
property #139 - Thanks @GrogsyShovel for fixing a property issue #142
PhantomCamera2D Frame Preview
PCam2D
nodes will now by default show what it will frame (green rectangle) when instantiated, similar to the purple rectangle a Camera2D
shows. This is to help determine the composition of the individual PCam2D
without switching the priority around.
This can optionally be disabled per instance to reduce screen clutter.
- Thanks @filipinyo for the proposal #131
🛠️ Changes & Improvements
PCam2D
now uses thePosition Smoothing
property of theCamera2D
instead of its own interpolation method. The damping should be very similar, but there might be a minor damping speed difference compared to releases prior to this.- Zoom property for PCam2D now has linked values, meaning adjusting the zoom by default now changes the width and height at the same time. Identical how
Camera2D
property behaves.
🐛 Fixes
- Resolved an issue where the
PCam2D
Priority Override
property wasn't being set. - Resolved an issue where
Framed Follow
mode would behave strangely if it wasn't the firstPCam
to have the highest priority when a scene starts.- Thanks @PanHoracy for the report #143
- Resolved an issue where the
Camera
would jump to and tween from unexpected positions if theCamera
's parent nodes had any positional offsets. - Resolved an issue where
Third Person Follow
's SpringArm3D node wasn't updating its length during runtime when using the setter method.- Thanks @niceandgoodonline for the report #135
- Resolved an issue an on high DPI monitors where editor icons didn't scale properly and looked tiny compared to others.
⚕️ New Contributors
- @GrogsyShovel made their first contribution in #142
- Special shout out for being the first project contributor 🎉