[Godot] C#简单实现人物的控制和动画

目录

实现效果

场景搭建

脚本实现

移动

动画

完整脚本

相机跟随

总结


实现效果


场景搭建

本文章只分享了关于移动和动画的,没有给碰撞体,大家根据需要自行添加吧

相机的缩放大小可以根据自己的需要调整

我的人物动画结构是这样的,待机动(idle )}和移动动画(walk


脚本实现

移动

首先,我们需要声明一个移动速度变量,然后将移动代码写在Process函数中

cs 复制代码
using Godot;
using System;

public partial class Player : CharacterBody2D
{
    [Export] public float moveSpeed;

    public override void _Process(double delta)
    {
        Move((float)delta);
    }

    void Move(float delta)
    {
        Vector2 direction = Vector2.Zero;

        if (Input.IsActionPressed("right"))
            direction.X += 1;
        if (Input.IsActionPressed("left"))
            direction.X -= 1;
        if (Input.IsActionPressed("down"))
            direction.Y += 1;
        if (Input.IsActionPressed("up"))
            direction.Y -= 1;

        direction = direction.Normalized();
        Velocity = direction * moveSpeed;
        MoveAndSlide(); //根据速度滑动式移动角色,并自动处理碰撞
    }

}

构建场景,在人物面板设置变量值,然后在面板里面添加按键映射,我们可以就能正常的移动人物了

动画

接下来是动画部分,我用枚举实现了一个简单的状态机,并且在移动代码里面添加了水平翻转的代码

cs 复制代码
using Godot;
using System;

public partial class Player : CharacterBody2D
{
    private enum AnimState
    {
        idle,
        walk
    }
    AnimState animState = AnimState.idle;

    private AnimatedSprite2D _playerAnim;

    public override void _Ready()
    {
        _playerAnim = GetNode<AnimatedSprite2D>("./AnimatedSprite2D");
    }

    public override void _Process(double delta)
    {
        Move((float)delta);

        AnimStateSwitch();
    }

    void Move(float delta)
    {
        ...

        if (direction != Vector2.Zero)
        {
            ...

            if (direction.X > 0) _playerAnim.FlipH = false;
            else if (direction.X < 0) _playerAnim.FlipH = true;
        }
        else
        {
            animState = AnimState.idle;
        }
    }

    void AnimStateSwitch()
    {
        switch (animState)
        {
            case AnimState.idle: _playerAnim.Play("idle"); break;
            case AnimState.walk: _playerAnim.Play("walk"); break;
        }
    }
}

构建并运行场景,我们就能丝滑的控制人物的动画了

完整脚本

cs 复制代码
using Godot;
using System;

public partial class Player : CharacterBody2D
{
    [Export] public float moveSpeed;

    private enum AnimState
    {
        idle,
        walk
    }
    AnimState animState = AnimState.idle;

    private AnimatedSprite2D _playerAnim;

    public override void _Ready()
    {
        _playerAnim = GetNode<AnimatedSprite2D>("./AnimatedSprite2D");
    }

    public override void _Process(double delta)
    {
        Move((float)delta);

        AnimStateSwitch();
    }

    void Move(float delta)
    {
        Vector2 direction = Vector2.Zero;

        if (Input.IsActionPressed("right"))
            direction.X += 1;
        if (Input.IsActionPressed("left"))
            direction.X -= 1;
        if (Input.IsActionPressed("down"))
            direction.Y += 1;
        if (Input.IsActionPressed("up"))
            direction.Y -= 1;

        direction = direction.Normalized();
        if (direction != Vector2.Zero)
        {
            Velocity = direction * moveSpeed;
            animState = AnimState.walk;
            MoveAndSlide();

            if (direction.X > 0) _playerAnim.FlipH = false;
            else if (direction.X < 0) _playerAnim.FlipH = true;
        }
        else
        {
            animState = AnimState.idle;
        }
    }

    void AnimStateSwitch()
    {
        switch (animState)
        {
            case AnimState.idle: _playerAnim.Play("idle"); break;
            case AnimState.walk: _playerAnim.Play("walk"); break;
        }
    }
}

相机跟随

关于相机的平滑跟随,我们有一个简单的办法,设置Position Smoothing 属性EnabledTrue 即可平滑跟随,可以设置speed来控制跟随的速度


总结

这里简单的跟大家分享了一下基础的控制人物方法,大家可以根据需要自行调整

相关推荐
大Mod_abfun10 小时前
Unity案例10-水晶矿石碰撞碎裂案例
unity·游戏引擎
xcLeigh11 小时前
Unity基础:Input输入系统入门——键盘、鼠标与触摸检测
unity·计算机外设·游戏引擎
zhchyun20081 天前
【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(05)
ui·unity·游戏引擎
_ZHOURUI_H_1 天前
不做完整 ECS,只优化数据布局:Unity EasyECS 到底是什么
unity·性能优化·游戏引擎
郝学胜-神的一滴2 天前
Horse3D 游戏引擎研发笔记(七):Clydesdale——从流式日志到多输出订阅
c++·qt·unity·游戏引擎·图形渲染·unreal engine·opengl
江上闲人.3 天前
Wardogs战犬\战狗Beta测试启动报错UE崩溃卡顿?解决方法来了
游戏·游戏引擎·虚幻·战犬·战狗·wardogs
杨丰玮4183 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
鼎艺创新科技4 天前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘