iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
SideProject30

初探 Godot系列 第 8

[DAY 8] 接觸 Part.1 (CharacterBody2D, CollisionShape2D)

  • 分享至 

  • xImage
  •  

今日目標:感測物件間的接觸


事前準備

  • 介紹 CharacterBody2D

    A 2D physics body specialized for characters moved by script.

    CharacterBody2D is a specialized class for physics bodies that are meant to be user-controlled. They are not affected by physics at all, but they affect other physics bodies in their path.

      這是一個專門作為使用者控制人物用的一個類別,這個類別的物件可以影響到其他物理物件卻不會被其他人影響,今天我們使用這個類別賦予主角物理特性。
    
  • 介紹 CollisionShape2D

    A node that provides a Shape2D to a CollisionObject2D parent.

    A node that provides a Shape2D to a CollisionObject2D parent and allows to edit it. This can give a detection shape to an Area2D or turn a PhysicsBody2D into a solid object.

      這個節點可以產生並讓我們修改人物的碰撞空間。
    

出發

  • 開啟一個新專案

  • 在場景中新增節點 CharacterBody2D,加上後可以看到節點旁邊出現黃色警告,點擊後可以看到下述說明:

    該節點無形狀,故無法與其他物件碰撞或互動

    因此我們在此節點下加入子節點:CollisionShape2D

  • 加完的 CollisionShape2D 節點也出現了警告:

    CollisionShape2D 必須賦予形狀才能運作,請先請先建立形狀!

    因此我們在右邊的屬性面板 Shape 點開下拉選單,新增 RectangleShape2D。

  • 接著幫我們的人物加上圖片,在 CharacterBody2D 下新增子節點:Sprite2D,並將 godot icon 放到 Sprite2D 右邊屬性面板的 Texture

    # 目前的節點架構
    |--CharacterBody2D
    |   |--CollisionShape2D
    |   |--Sprite2D
    
  • 這時我們需要調整 RectangleShape2D 讓他符合我們角色的實際範圍 -> 點擊上方 2D 的頁面 -> 點擊 CollisionShape2D 可以在 2D 場景中看到目前用紅色點圍繞的空間,也就是能觸發物理的範圍。
    https://ithelp.ithome.com.tw/upload/images/20230923/20162875vbUzFrmZdQ.png
    透過拖曳紅色點使範圍符合圖片大小
    https://ithelp.ithome.com.tw/upload/images/20230923/20162875VUoRVQHBZw.png

  • 現在可以新增我們移動人物的腳本(附加腳本、樣板選擇 Node: Default),這裡可以參考 Day4 的解釋。

    extends CharacterBody2D
    
    @export var weight:float = 0.2
    
    # Called when the node enters the scene tree for the first time.
    func _ready():
        pass
    
    # Called every frame. 'delta' is the elapsed time since the previous frame.
    func _process(delta):
        # $"." 表示根節點,可以直接從左邊拖曳 CharacterBody2D 到程式碼中會自動生成。
        var pos = $".".position.lerp(get_viewport().get_mouse_position(), weight)
        $".".position = pos
    

執行

現在播放目前場景即可達到如 Day4 的移動效果。

儲存此場景,完成人物的 Scene 的建構

目前還看不到物理的效果,剩下的部分我們明天再繼續。

:)


上一篇
[DAY 7] 放大縮小 (scale)
下一篇
[DAY 9] 接觸 Part.2 (Area2D, Polygon2D)
系列文
初探 Godot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言