In Godot Engine 3.x, you can write a first person controller script in GDscript by creating a new script and attaching it to a KinematicBody node. Here is an example of a basic first person controller script:
```csharp
extends KinematicBody

var speed = 5
var mouse_sensitivity = 0.1
var jumping = false
var jump_speed = 10
var gravity = -20
var jump_height = 1.5
var jump_sustain = 0.1

func _input(event):
    if event is InputEventMouseMotion:
        rotation_degrees.y -= event.relative.x * mouse_sensitivity
        rotation_degrees.x = clamp(rotation_degrees.x + event.relative.y * mouse_sensitivity, -90, 90)
    
    if event is InputEventKey and event.pressed and event.scancode == KEY_W:
        var velocity = speed * Vector3(0, 0, 1)
        velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y)
        move_and_slide(velocity)
        
    if event is InputEventKey and event.pressed and event.scancode == KEY_S:
        var velocity = speed * Vector3(0, 0, -1)
        velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y)
        move_and_slide(velocity)
        
    if event is InputEventKey and event.pressed and event.scancode == KEY_A:
        var velocity = speed * Vector3(-1, 0, 0)
        velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y)
        move_and_slide(velocity)
        
    if event is InputEventKey and event.pressed and event.scancode == KEY_D:
        var velocity = speed * Vector3(1, 0, 0)
        velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y)
        move_and_slide(velocity)
        
    if event is InputEventKey and event.pressed and event.scancode == KEY_SPACE and not jumping:
        jumping = true
        var velocity = Vector3(0, jump_speed, 0)
        move_and_slide(velocity)
        
func _physics_process(delta):
    if jumping:
        var velocity = move_and_slide(Vector3(0, gravity * delta, 0))
        if velocity.y < 0:
            jumping = false
```

In Godot Engine 4.x, the equivalent to the KinematicBody node is the CharacterController node. To use this node, you will need to change your script to inherit from the CharacterController class. Additionally, the input handling and movement control will be different, as the CharacterController node uses a different API. Here is an example of how the first person controller script would look in Godot Engine 4.x:
```
extends CharacterController

var speed = 5
var mouse_sensitivity = 0.1
var jumping = false
var jump_speed = 10
var gravity = -20
var jump_height = 1.5
var jump_sustain = 0.1

func _input(event):
    if event is InputEventMouseMotion:
        rotation_degrees.y -= event.relative.x * mouse_sensitivity
        rotation_degrees.x = clamp(rotation_degrees.x + event.relative.y * mouse_sensitivity, -90, 90)

    if event is InputEventKey and event.pressed and event.scancode == KEY_W:
        var velocity = speed * Vector3(0, 0, 1)
        velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y)
        move(velocity)
    
    if event is InputEventKey and event.pressed and event.scancode == KEY_S:
        var velocity = speed * Vector3(0, 0, -1)
        velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y)
        move(velocity)
    
    if event is InputEventKey and event.pressed and event.scancode == KEY_A:
        var velocity = speed * Vector3(-1, 0, 0)
        velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y)
        move(velocity)
    
    if event is InputEventKey and event.pressed and event.scancode == KEY_D:
        var velocity = speed * Vector3(1, 0, 0)
        velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y)
        move(velocity)
    
    if event is InputEventKey and event.pressed and event.scancode == KEY_SPACE and not jumping:
        jumping = true
        var velocity = Vector3(0, jump_speed, 0)
        velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y)
        move(velocity)
    
func _physics_process(delta):
    if jumping:
        var velocity = move(Vector3(0, gravity * delta, 0))
    if velocity.y < 0:
        jumping = false
```

Note: The `move` method replaces the `move_and_slide` method from Godot Engine 3.x, and it uses the CharacterController API to handle movement.
ใน Godot Engine 3.x คุณสามารถเขียนสคริปต์ควบคุมบุคคลที่หนึ่งใน GDscript ได้โดยการสร้างสคริปต์ใหม่และแนบเข้ากับโหนด KinematicBody นี่คือตัวอย่างของสคริปต์ตัวควบคุมบุคคลที่หนึ่งขั้นพื้นฐาน: ```csharp ขยาย KinematicBody var speed = 5 var mouse_sensitivity = 0.1 var jumping = false var jump_speed = 10 var Gravity = -20 var jump_height = 1.5 var jump_sustain = 0.1 func _input( เหตุการณ์): ถ้าเหตุการณ์เป็น InputEventMouseMotion: Rotation_degrees.y -= event.relative.x * mouse_sensitivity Rotation_degrees.x = CLAMP(rotation_degrees.x + event.relative.y * mouse_sensitivity, -90, 90) ถ้าเหตุการณ์เป็น InputEventKey และเหตุการณ์ กดและ event.scancode == KEY_W: var velocity = speed * Vector3(0, 0, 1) velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y) move_and_slide(velocity) ถ้าเหตุการณ์เป็น InputEventKey และ event.pressed และ event.scancode == KEY_S: var velocity = speed * Vector3(0, 0, -1) velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y) move_and_slide(velocity) ถ้าเหตุการณ์เป็น InputEventKey และ event.pressed และ event.scancode == KEY_A: var velocity = speed * Vector3(-1, 0, 0) velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y) move_and_slide(velocity) ถ้าเหตุการณ์เป็น InputEventKey และ event.pressed และ event.scancode == KEY_D: var velocity = speed * Vector3(1, 0, 0) velocity = velocity.rotated(Vector3(0, 1, 0), -rotation .y) move_and_slide(velocity) ถ้าเหตุการณ์เป็น InputEventKey และ event.pressed และ event.scancode == KEY_SPACE และไม่กระโดด: Jumping = true var velocity = Vector3(0, jump_speed, 0) move_and_slide(velocity) func _physics_process(delta): ถ้ากระโดด: var velocity = move_and_slide(Vector3(0, Gravity * delta, 0)) ถ้า velocity.y < 0: jumping = false ``` ใน Godot Engine 4.x สิ่งที่เทียบเท่ากับโหนด KinematicBody คือโหนด CharacterController หากต้องการใช้โหนดนี้ คุณจะต้องเปลี่ยนสคริปต์ของคุณให้สืบทอดจากคลาส CharacterController นอกจากนี้ การจัดการอินพุตและการควบคุมการเคลื่อนไหวจะแตกต่างกัน เนื่องจากโหนด CharacterController ใช้ API ที่แตกต่างกัน ต่อไปนี้เป็นตัวอย่างลักษณะที่สคริปต์ตัวควบคุมคนแรกจะมีลักษณะอย่างไรใน Godot Engine 4.x: ``` ขยาย CharacterController var speed = 5 var mouse_sensitivity = 0.1 var jumping = false var jump_speed = 10 var Gravity = -20 var jump_height = 1.5 var jump_sustain = 0.1 func _input (เหตุการณ์): หากเหตุการณ์เป็น InputEventMouseMotion: การหมุน_องศา.y -= event.relative.x * mouse_sensitivity การหมุน_องศา.x = แคลมป์ (rotation_degrees.x + event.relative.y * mouse_sensitivity, -90, 90) ถ้าเหตุการณ์เป็น InputEventKey และ event.pressed และ event.scancode == KEY_W: var velocity = speed * Vector3(0, 0, 1) velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y) เคลื่อนที่ (ความเร็ว) หากเหตุการณ์เป็น InputEventKey และ event.pressed และ event.scancode == KEY_S: var velocity = speed * Vector3(0, 0, -1) velocity = velocity.rotated(Vector3(0, 1, 0), -rotation .y) ย้าย(ความเร็ว) หากเหตุการณ์เป็น InputEventKey และ event.pressed และ event.scancode == KEY_A: var velocity = speed * Vector3(-1, 0, 0) velocity = velocity.rotated(Vector3(0, 1, 0) ), -rotation.y) ย้าย(ความเร็ว) ถ้าเหตุการณ์เป็น InputEventKey และ event.pressed และ event.scancode == KEY_D: var velocity = speed * Vector3(1, 0, 0) velocity = velocity.rotated(Vector3(0, 1, 0), -rotation.y) ย้าย(ความเร็ว) ถ้าเหตุการณ์เป็น InputEventKey และ event.pressed และ event.scancode == KEY_SPACE และไม่กระโดด: Jumping = true var velocity = Vector3(0, jump_speed, 0) velocity = velocity .rotated(Vector3(0, 1, 0), -rotation.y) เคลื่อนที่(ความเร็ว) func _physics_process(delta): ถ้ากระโดด: var velocity = move(Vector3(0, แรงโน้มถ่วง * delta, 0)) ถ้า velocity.y < 0: jumping = false ``` หมายเหตุ: เมธอด `move` จะแทนที่เมธอด `move_and_slide` จาก Godot Engine 3.x และใช้ CharacterController API เพื่อจัดการการเคลื่อนไหว
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence