当前位置: 首页 > news >正文

Unity2D学习———角色移动两种方式+小怪追随+Unity演示+C#代码

目录

物理学移动

实现角色移动

C# 代码

Unity中操作

实现小怪追主角

C#代码

Unity操作

通过组件的方式去移动

C#代码


物理学移动

我们使用的是刚体受力会移动的物理学观点去实现角色的移动的。

当物体受力时就会向某一个方向移动其中的Time.fixedDeltaTime是物理引擎的渲染时间间隔为0.02s即每秒50帧

实现角色移动

C# 代码

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

public class PlayMovementController : MonoBehaviour
{
    public float moveSpeed = 3.0f;
    private Vector2 movDir = new Vector2();
    //物理引擎方式采用的参数
    public Transform target;
    private Rigidbody2D rb2D;
    // Start is called before the first frame update
    void Start()
    {
        rb2D = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        MoveCharacter();
    }

    private void MoveCharacter()
    {
        movDir.x = Input.GetAxisRaw("Horizontal");
        movDir.y = Input.GetAxisRaw("Vertical");

        //防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2
        //归一化处理
        movDir.Normalize();

        //角色移动,要在Unity页面的target栏拖入需要移动的物体。
        rb2D.position += movDir * moveSpeed * Time.fixedDeltaTime;

//这句代码也行!! rb2D.MovePosition(new Vector2(transform.position.x, transform.position.y)+movDir*moveSpeed*Time.fixedDeltaTime);
 
    }
}

防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2
归一化处理

角色移动,要在Unity页面的target栏拖入需要移动的物体

Unity中操作

 

 

 

实现小怪追主角

就是一个物体追随另一个物体,这里演示主角追建筑

C#代码

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

public class PlayMovementController : MonoBehaviour
{
    public float moveSpeed = 3.0f;
    private Vector2 movDir = new Vector2();
    //物理引擎方式采用的参数
    public Transform target;
    private Rigidbody2D rb2D;
    // Start is called before the first frame update
    void Start()
    {
        rb2D = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        MoveCharacter();
    }

    private void MoveCharacter()
    {
        movDir.x = Input.GetAxisRaw("Horizontal");
        movDir.y = Input.GetAxisRaw("Vertical");

        //防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2
        //归一化处理
        movDir.Normalize();
        

        //角色向某个位置移动(不是受控制的移动)可以实现跟随或小怪追主角
        transform.position = Vector2.MoveTowards(transform.position,target.position,Time.deltaTime);

    }
}

防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2
归一化处理
角色向某个位置移动(不是受控制的移动)可以实现跟随或小怪追主角

Unity操作

选中角色并上锁 

 

通过组件的方式去移动

这个最简单的,我们通过获取当前位置直接计算出下一帧的位置,然后直接更改角色在下一个位置即可。

C#代码

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

public class PlayMovementController : MonoBehaviour
{
    public float moveSpeed = 3.0f;
    private Vector2 movDir = new Vector2();
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        MoveCharacter();
    }

    private void MoveCharacter()
    {
        movDir.x = Input.GetAxisRaw("Horizontal");
        movDir.y = Input.GetAxisRaw("Vertical");

        //防止角色斜向运动过快,我们让斜方向距离也为1,原来是根号2
        //归一化处理
        movDir.Normalize();
        //角色移动,Time.deltaTime表示渲染每帧的时间约等于(1/FPS)为了适配不同帧率的电脑,moveSpeed是角色移动的速度
        transform.position += new Vector3(movDir.x,movDir.y,0.0f)*moveSpeed*Time.deltaTime;



    }
}

 public class Transform : Component, IEnumerable
    {
        private class Enumerator : IEnumerator
        {
            private Transform outer;

            private int currentIndex = -1;

            public object Current => outer.GetChild(currentIndex);

            internal Enumerator(Transform outer)
            {
                this.outer = outer;
            }

            public bool MoveNext()
            {
                int childCount = outer.childCount;
                return ++currentIndex < childCount;
            }

            public void Reset()
            {
                currentIndex = -1;
            }
        }

        //
        // 摘要:
        //     The world space position of the Transform.

 

相关文章:

  • 拓展上机-3题解:哥德巴赫猜想
  • 如果你看不懂别人画的 UML 类图,看这一篇文章就够了
  • 【论文】论文阅读记录
  • 【第三十九讲】Boot 启动流程
  • ApkScan-PKID 查壳工具下载使用以及相关技术介绍
  • 从BNB遭黑客攻击(跨链桥BSC Token Hub遭到攻击),看公链中心化问题
  • 【多线程实践】一、为何使用多线程三种线程创建方式利弊分析
  • LIFELONG LEARNING WITH DYNAMICALLY EXPANDABLE NETWORKS论文阅读+代码解析
  • 计算机网络——集线器与交换机
  • 用通俗易懂的方式讲解:CatBoost 算法原理及案例
  • 系统架构演变和SpringCloud的定义:
  • 后端必会的前端vue基础知识
  • VGG16 - 咖啡豆识别
  • 2022.10.7 英语背诵
  • 『Android』什么是Service
  • bearychat的java client
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • java多线程
  • js学习笔记
  • KMP算法及优化
  • PHP那些事儿
  • vue.js框架原理浅析
  • 对象引论
  • 观察者模式实现非直接耦合
  • 实习面试笔记
  • 使用common-codec进行md5加密
  • 线性表及其算法(java实现)
  • 与 ConTeXt MkIV 官方文档的接驳
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • ###C语言程序设计-----C语言学习(3)#
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (黑马C++)L06 重载与继承
  • (七)Java对象在Hibernate持久化层的状态
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (图)IntelliTrace Tools 跟踪云端程序
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)ObjectiveC 深浅拷贝学习
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)原始图像数据和PDF中的图像数据
  • (转载)虚函数剖析
  • .bashrc在哪里,alias妙用
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .NET委托:一个关于C#的睡前故事
  • /var/lib/dpkg/lock 锁定问题
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • []常用AT命令解释()
  • [<死锁专题>]
  • [100天算法】-x 的平方根(day 61)