(C#脚本)Unity中角色移动的几种实现方法,以及心得。(适合新手入门)

Posted 记阿楠同学黑历史的小册子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(C#脚本)Unity中角色移动的几种实现方法,以及心得。(适合新手入门)相关的知识,希望对你有一定的参考价值。

目录

1.对Unity脚本写入有一定的思维了解。

2.分析需求,观察了解要实现的项目的条件在Unity中的外在表现。

3.开始通过代码实现功能。

4.一个整体的代码实现

5.学习心得


 

 

PS:首先我们要知道,在C#中Transform组件是可以直接调用的,而其他的(例如:Rigidbody,Animator)都需要通过 GetConpoment<组件的名称>(); 来获取进行实例化(一般在初始化时)。

例子:调用Rigidbody2D

private Rigidbody2D rb2D;//声明变量实例化

void Start()



      rb2d = GetComponent<Rigidbody2D>();//获取

1.对Unity脚本写入有一定的思维了解。

我们在C#中想要实现对Unity内各个组件、属性设置的修改和调用,首先要观察它在外部的形式,也就是Unity内的表现

比如我想要控制2D角色移动,那么改变的就它在X,Y轴上的坐标(横向和竖向),可以观察到每个物体的Transform组件下的Position就是该物体的坐标位置,所以我们只需要在脚本实现修改该坐标位置即可实现物体的移动。(见图1.1)

图1.1

2.分析需求,观察了解要实现的项目的条件在Unity中的外在表现。

a.上文已经提到,移动实际上就是物体坐标的改变,其次我们需要用键盘或鼠标对它进行控制,它需要有一个移动速度。

b.在Unity的Project Setting中可以看到它内置了Inpuut Manager,它作为对外和键盘鼠标交互。Horizontal控制物体在X轴上的运动,“A,D”输入(可以直接在外部修改)Vertical控制物体Y轴上的运动。(见图2.1)

 图2.1

3.开始通过代码实现功能。

a.在Assets里新建Scripts文件夹用于存放脚本文件,在该文件夹中建立PlayerMovementController脚本。

b.需要设置的变量,移动速度moveSpeed,定义一个二维向量moveDir

using UnityEngine;

public float MoveSpeed=3.0f;
private Vector2 moveDir = new Vector2();

ps:速度用public(把它暴露出去),方便我们在外部进行修改,表现是图3.1

 图3.1

c.写移动函数

把二维向量的两个方向与键盘交互绑定,当按一下A键,X坐标就有左边的1的增量

private void MoveCharacter

  moveDir.x = Input.GetAxisRaw('Horizontal');
  moveDir.y =Input.GetAixisRaw('Vertical');
  moveDir.Normalize();//当有两个方向的向量时进行整合

ps:Normalize 作为将两个方向向量合并处理的一个函数

图3.2

(1)调用transform代码实现

ps:因为我们这个组件做好后要挂到Player上,所以这里的transform都是直接调用的Player的。

在坐标位置上加上变化值

transform.position += Vector3(moveDir.x,moveDir.y,0.0f) * MoveSpeed * Time.deltaTime;

ps:其中Time.delate相当于一个变量,理解为在一定时间内完成上一帧的动作,运行有50帧,它就是0.02,它会随着电脑运行帧率而变化,目的是为了让游戏在不同电脑环境下都显得更为流畅稳定。

调用transform自带的Translate函数直接修改变化

transform.Translate(moveDir * MoveSpeed * Time.deltaTime);

(2)调用RigidBody2D实现代码

要先给Player挂上Rigidbody2D的组件,直接在Unity界面Player下Add Component

先声明变量

private RigidBody2D rb2d;

用Rigidbody2D内置的MovePosition函数

rb2d.MovePosition(new Vector2(transform.position.x,transform.position.y)+moveDir * MoveSpeed * Time.fixedDeltaTime);

在原坐标上增加变化值

rb2d.position += moveDir * MoveSpeed * Time.fixedDeltaTime;

把Player当作一个刚体,相当于给它一个速度推动移动,调用velocity函数,它内置了fixeddDeltaTime,所以不用乘出来

rb2D.velocity = moveDir * MoveSpeed;//velocity函数相当于内置了fixedDeltaTime,所以不用乘。

以上是利用Rigidbody2D的三种实现方法,这里用的Time.fixedDeltaTime,下面说一下它的解读以及和Time.deltaTime的区别。

使用Time.fixedDeltaTime要放到FixedUpdate运行,fixedUpdate的刷新根据fixedDeltaTime的时间来的,而它是一个固定值0.02,相当于是1秒50帧。

Update是每帧调用一次。

4.一个整体的代码实现

transfo:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovementController : MonoBehaviour

    public float moveSpeed = 3.0f;
    private Vector2 movDir = new Vector2();
    private Rigidbody2D rb2d;

    void Start()
    
        rb2d = GetComponent<Rigidbody2D>();
    

     private void FixedUpdate()
    
        MoveCharacter();
    
    void Update()
    
        UpdateState();
    
    private void MoveCharacter()
    
        movDir.x = Input.GetAxisRaw("Horizontal");
        movDir.y = Input.GetAxisRaw("Vertical");
        movDir.Normalize();
        transform.position += new Vector3(movDir.x, movDir.y,0.0f) * moveSpeed * Time.deltaTime;
 
        transform.Translate(movDir * moveSpeed * Time.deltaTime);

    



Rigidbody2D :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovementController : MonoBehaviour

    public float moveSpeed = 3.0f;
    private Vector2 movDir = new Vector2();
    private Rigidbody2D rb2d;

    void Start()
    
        rb2d = GetComponent<Rigidbody2D>();
    

     private void FixedUpdate()
    
        MoveCharacter();
    
    void Update()
    
        UpdateState();
    
    private void MoveCharacter()
    
    rb2d.MovePosition(new Vector2(transform.position.x, transform.position.y) + movDir * moveSpeed * Time.fixedDeltaTime);
        rb2d.position += movDir * moveSpeed * Time.fixedDeltaTime;
        rb2d.velocity = movDir * moveSpeed;

    



5.学习心得

最后说一点,我认为Unity的学习重在实践,多跟着别人的教学项目做,但不能单纯跟着,要多思考,它这个函数背后是怎么运作的,以后自己写别的时候这点要注意什么,上手之后有了问题再去解决,实践出真知一点没错。

我个人是先看视频,再着手做,做完后,再根据自己做的东西总结成笔记,最后来写成博客,就像是努力让别人也能接收,也是对自己知识的一种升级巩固。

 

100个 Unity实用技能| C# 检查字典中是否存在某个Key的几种方法

Unity 小科普

老规矩,先介绍一下 Unity 的科普小知识:

  • Unity是 实时3D互动内容创作和运营平台 。
  • 包括游戏开发美术建筑汽车设计影视在内的所有创作者,借助 Unity 将创意变成现实。
  • Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机平板电脑PC游戏主机增强现实虚拟现实设备。
  • 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏
  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------


Unity 实用小技能学习

C# 检查字典中是否存在某个Key的几种方法

在做项目的过程中我们经常需要检查字典中是否存在某个Key,从而对字典进行添加和删除的操作

下面就来介绍几种可以正常使用的方法。一般来说使用第一种方法就可以满足我们的需求啦~

方法1: public bool ContainsKey (TKey key);

检查字典中是否存在某个Key的常用API

       Dictionary<int, string> dic1 = new Dictionary<int, string>()   1, "张三" ,2,"李四" ,3,"王五"  ;
        int key1 = 1;
        if (dic1.ContainsKey(key1))
        
            Debug.Log("1:检测到Key为1的值。Value:"+dic1[key1]);
        
        else
        
            Debug.Log("1:未检测到Key为1的值。");
        

方法2: TryGetValue

        Dictionary<int, string> dic2 = new Dictionary<int, string>()   1, "张三" ,  2, "李四" ,  3, "王五"  ;
        int key2 = 2;
        string value2 = "";
        if (dic2.TryGetValue(key2, out value2))
        
            Debug.Log("2:检测到Key为2的值。Value:" + value2);
        
        else
        
            Debug.Log("2:未检测到Key为1的值。");
        

方法3: Keys.Any()。需导入using System.Linq;后使用

        Dictionary<string, string> dic3 = new Dictionary<string, string>()   "a", "张三" ,  "b", "李四" ,  "c", "王五"  ;
        string key3 = "a";
        if (dic3.Keys.Any((e) => string.Compare(e, key3) == 0))
        
            Debug.Log("3:检测到Key为1的值。Value:" + dic3[key3]);
        
        else
        
            Debug.Log("3:未检测到Key为1的值。");
        

运行效果:


以上是关于(C#脚本)Unity中角色移动的几种实现方法,以及心得。(适合新手入门)的主要内容,如果未能解决你的问题,请参考以下文章

(转)Unity3D中移动物体位置的几种方法

角色移动、加速 C# Unity

100个 Unity实用技能| C# 检查字典中是否存在某个Key的几种方法

100个 Unity实用技能| C# 检查字典中是否存在某个Key的几种方法

100个 Unity实用技能| C# 检查字典中是否存在某个Key的几种方法

100个 Unity实用技能☀️ | C# 检查字典中是否存在某个Key的几种方法