目录
实现效果

场景搭建

本文章只分享了关于移动和动画的,没有给碰撞体,大家根据需要自行添加吧
相机的缩放大小可以根据自己的需要调整
我的人物动画结构是这样的,待机动(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 属性Enabled 为True 即可平滑跟随,可以设置speed来控制跟随的速度
总结
这里简单的跟大家分享了一下基础的控制人物方法,大家可以根据需要自行调整