【Unity小白教程】用刚体和DOTween做一个丝滑的八向移动

2 天前

【Unity小白教程】用刚体和DOTween做一个丝滑的八向移动

准备工作

  • 一个八核十六线程的脑子

  • 一个Unity(笔者版本为2022.x),一个DOTween插件(Assetstore免费,链接:AssetStore下载

  • 你大概还需要这么一个东西,Player的图片(如下图)

正式开始

随便创建一个GameObject,添加SpriteRenderer脚本,将SpriteRenderer脚本上的Sprite赋值为Player的图片(我的Player图片名字叫Player-White)

创建一个C#脚本并命名为PlayerController,开始编写代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;//DOTween插件命名空间

public class PlayerController : MonoBehaviour
{
    public float MaxSpeed, Speed;//最大移动速度/当前移动速度

    public Vector2 Raw_Axis = Vector2.zero;//玩家输入向量

    Vector2 Rot_Axis = Vector2.zero;//下面处理旋转会用到的输入向量

    private Rigidbody2D _rb;//玩家刚体组件

    void Start()
    {
        Speed = MaxSpeed;//初始化Speed
        _rb = GetComponent<Rigidbody2D>();//初始化刚体组件
    }

    void Update()
    {
        //处理玩家输入,用GetAxis获取玩家当前输入的方向
        //Horizontal是水平轴(WASD中的A,D键,方向键中的左右键)
        //Vertical是垂直轴(WASD中的W,D键,方向键中的上下键)
        Raw_Axis = Vector2.right * Input.GetAxisRaw("Horizontal") + Vector2.up * Input.GetAxisRaw("Vertical");

        transform.DORotate(Rotate(), 0.1f);//DORotate:DOtween插件方法,前一个参数是Vector3向量,代表旋转到哪里,第二个参数是旋转所耗费的时间
    }

    void FixedUpdate()
    {
        if (Raw_Axis != Vector2.zero)//判断用户是否进行输入
        {
            _rb.velocity = Raw_Axis * Speed * Time.fixedDeltaTime + (IsSpring ? Raw_Axis * Spring * Time.fixedDeltaTime : Vector2.zero);//刚体移动
            Rot_Axis = Raw_Axis;//将旋转输入向量赋值
        }
        else
        {
            _rb.velocity = Vector2.zero;//刚体速度归零
        //注意此时并没有将Rot_Axis赋值,也就是当玩家第一次输入后,Rot_Axis始终保持着有值状态
        }
    }
    Vector3 Rotate()//旋转方法,返回一个向量表示旋转值
    {
        int x = (int)Rot_Axis.x;//旋转向量的x轴
        int y = (int)Rot_Axis.y;//旋转向量的y轴
        if (x == 0 && y == 0) return Vector3.zero;//玩家没有输入,此时保持原来的旋转(向上)
        if (x == 1 && y == 0) return Vector3.forward * -90;//玩家按下D/→键,此时旋转负九十度(向右)
        if (x == -1 && y == 0) return Vector3.forward * 90;//玩家按下A/←键,此时旋转九十度(向左)
        if (x == 0 && y == 1) return Vector3.zero;//玩家没有输入,此时保持原来的旋转(向上)
        if (x == 0 && y == -1) return Vector3.forward * 180;//玩家按下S/↓键,此时旋转180度(向下)
        if (x == 1 && y == 1) return Vector3.forward * -45;//玩家按下W和D键(或者↑和→键)此时旋转负45度(向右上)
        if (x == -1 && y == -1) return Vector3.forward * 135;//玩家按下S和A键(或者↓和←键)此时旋转135度(向左下)
        if (x == 1 && y == -1) return Vector3.forward * -135;//玩家按下S和D键(或者↓和→键)此时旋转负135度(向右下)
        if (x == -1 && y == 1) return Vector3.forward * 45;//玩家按下A和W键(或者上和←键)此时旋转负45度(向左上)
        return Vector3.zero;//都不是,保持原来的旋转(向上)
    }
    }

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...