【Unity】常见的角色移动旋转

news2024/9/21 16:39:06

 

在Unity 3D游戏引擎中,可以使用不同的方式对物体进行旋转。以下是几种常见的旋转方式:

  1. 欧拉角(Euler Angles):欧拉角是一种常用的旋转表示方法,通过绕物体的 X、Y 和 Z 轴的旋转角度来描述物体的旋转。在Unity中,可以通过修改物体的 transform.eulerAngles 属性来进行欧拉角旋转。

  2. 四元数(Quaternion):四元数是另一种常见的旋转表示方法,在Unity中经常用于插值和平滑旋转。使用四元数可以避免万向锁等问题,并提供更高效和准确的旋转计算,可以通过修改物体的 transform.rotation 属性来进行四元数旋转。

  3. 轴角(Axis-Angle):轴角表示法使用一个单位向量来定义旋转轴,并使用旋转角度来描述旋转。在Unity中,可以使用 Quaternion.AngleAxis() 函数来创建一个轴角旋转,并通过修改物体的 transform.rotation 属性进行应用。

  4. 矩阵(Matrix):矩阵表示法通过使用旋转矩阵来描述旋转变换。在Unity中,可以通过修改物体的 transform.localRotation 属性或 transform.rotation 属性中的矩阵元素来进行矩阵旋转。


    我们接下来实现下面2种方法来实现人物的旋转和移动

一:使用WADS进行移动旋转 

代码实现: 

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

public class PlayerMove : MonoBehaviour
{
    // Start is called before the first frame update

    //设置速度
    public float speed = 6f;
    Rigidbody rig;
    //动画
    Animator anim;
    //偏移量
    Vector3 moveMent;

    //跳起来的力
    public float Jump_AddForce = 300f;

    void Awake()
    {
        //获取刚体
        rig = GetComponent<Rigidbody>();
        //获取动画
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        // -1  1
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");

        //移动 横向和纵向
        Move(h, v);

    }
    void Move(float h, float v)
    {
        //设置方向
        moveMent.Set(h, 0f, v);
        moveMent = moveMent.normalized * speed * Time.deltaTime;

        //通过刚体主键移动 对象
        rig.MovePosition(transform.position + moveMent);

        //移动动画
        bool isWalking = (h != 0 || v != 0);
        anim.SetBool("Run", isWalking);

        //旋转
        Vector3 dir = new Vector3(h, 0, v);
        if (dir != Vector3.zero)
        {
            transform.rotation = Quaternion.LookRotation(dir);
            transform.Translate(Vector3.forward * speed * Time.deltaTime);
        }
    }

二:使用鼠标来控制人物的旋转,WASD移动

代码实现:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
 
public class PlayerMove : MonoBehaviour
{
    // Start is called before the first frame update
 
    //设置速度
    public float Speed = 6f;
    Rigidbody RigidbodyPlayer;
    Animator animatorPlayer;
    //偏移量
    Vector3 moveMent;
    //地板
    LayerMask floorMask;
 
    //Vector3 playerToMouse;
 
    void Awake()
    {
        //获取刚体
        RigidbodyPlayer = GetComponent<Rigidbody>();
        //获取动画
        animatorPlayer = GetComponent<Animator>();
        //获取地板
        floorMask = LayerMask.GetMask("floor");
    }
 
    // Update is called once per frame
    void FixedUpdate()
    {
        // -1  1
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");
 
        //移动 横向和纵向
        Move(h, v);
 
        //检测动画
        Animating(h, v);
 
        //角色旋转
        Turning();
    }
    void Move(float h, float v)
    {
        //设置方向
        moveMent.Set(h, 0f, v);
        moveMent = moveMent.normalized * Speed * Time.deltaTime;
 
        //通过刚体主键移动 对象
        RigidbodyPlayer.MovePosition(transform.position + moveMent);
    }
    //移动动画
    void Animating(float h, float v)
    {
        if (h != 0 || v != 0)
        {
            animatorPlayer.SetBool("IsWaking", true);
        }
        else
        {
            animatorPlayer.SetBool("IsWaking", false);
        }
    }
    void Turning()
    {
        Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit cameraHit;
        if (Physics.Raycast(cameraRay, out cameraHit, 100f, floorMask))
        {
            Vector3 playerToMouse = cameraHit.point - transform.position;
            playerToMouse.y = 0f;
            //旋转 四元素
            Quaternion newQraternion = Quaternion.LookRotation(playerToMouse);
 
            //角色刚体旋转
            RigidbodyPlayer.MoveRotation(newQraternion);
        }
    }
}


最后

以上步骤就是实现角色的移动旋转。希望能对你们提供帮助!!!

看到的小伙伴一键三连一下吧,你们的支持让我更有动力去创作和分享,希望能一直为你们带来惊喜和收获。

 

一键三连吧!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/948134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

七、MySQL(DML)如何往表中添加数据?

1、基础语法&#xff1a; &#xff08;1&#xff09;一对一添加数据&#xff1a; 一次只能添加一组数据&#xff0c;可以指定对应字段 insert into 表名 (字段名1,字段名2,……) values (数值1.数值2&#xff0c;……) &#xff08;2&#xff09;给全部字段添加数据&#…

vmware安装centos7虚拟机图文详解

1.打开vmware&#xff0c;点击创建新的虚拟机 2.选择自定义&#xff08;高级&#xff09;&#xff0c;下一步 3.下一步 4.选择稍后安装操作系统 5.操作系统选择linux&#xff0c;版本选择centos7 64位&#xff0c;下一步 6.创建文件夹&#xff0c;选择虚拟机存放的位置&#x…

Exactly Protocol 攻击事件原理分析

Exactly Protocol 攻击事件原理分析 8 月 18 日&#xff0c;Exactly protocol 遭遇黑客攻击&#xff0c;攻击者已获利约 1204 万美元。 安全公司Safful对此事件第一时间进行了技术分析&#xff0c;并总结了安全防范手段&#xff0c;希望后续项目可以引以为戒&#xff0c;共筑区…

企业小件固定资产怎么管理,有什么有效方式?

小件固定资产是指价值较低、使用寿命较短的固定资产&#xff0c;一般用于生产、制造、维修等领域。一些常见的行业中广泛使用小件固定资产&#xff1a;  制造业&#xff1a;小件固定资产在制造业中应用广泛&#xff0c;如机器设备、工具、测量仪器等。  建筑业&#xff1a;…

Spring Boot业务系统如何实现海量数据高效实时搜索

1.概述 我们都知道随着业务系统的发展和使用&#xff0c;数据库存储的业务数据量会越来越大&#xff0c;逐渐成为了业务系统的瓶颈。在阿里巴巴开发手册中也建议&#xff1a;单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表&#xff0c;如果预计三年后数据量根本达…

科创板50etf和科创50etf的区别不同点?一定要看!

很多在交易期权的时候会对科创50ETF期权和科创板50ETF期权标的物选择有疑问&#xff0c;两者与有何区别呢&#xff0c;选择哪个比较合适&#xff0c;别着急&#xff0c;下文为大家介绍科创板50etf和科创50etf的区别不同点&#xff1f;一定要看&#xff01;本文来自&#xff1a;…

谁做的方案,竟把财务数据分析套路都摸透了

来不及计算组合多变又复杂量大的财务数据分析指标&#xff1f;不知道该用哪些财务数据分析方法技巧&#xff1f;不知道怎么把信息量巨大的财务数据分析报表做得易读易理解&#xff1f;别担心&#xff0c;奥威BI数据可视化工具都把套路摸透了&#xff0c;并提出一套系统、标准化…

kafka+Kraft模式集群+安全认证

Kraft模式安全认证 前章内容聊到了Kafka的Kraft集群的配置及使用。本篇再来说说kafka的安全认证方面的配置&#xff0c;。 Kafka提供了多种方式来进行安全认证&#xff0c;包括身份认证、授权和加密传输。一些常用的Kafka安全认证方式&#xff1a; SSL/TLS&#xff1a;使用S…

go的数据结构-变量的大小是0字节

查看变量大小 unsafe.Sizeof(int(0)) 变量&#xff1a; 指针&#xff1a; int和指针大小跟随系统字长&#xff0c;空结构体没有任何成员&#xff0c;是有地址没有长度&#xff0c;所有空结构体都指向同一个结构体地址&#xff08;不被包含在其他结构体中&#xff09;zerobas…

OpenHarmony Meetup 2023 广州站圆满举办,城市巡回全面启航

“OpenHarmony正当时——技术开源”OpenHarmony Meetup 2023城市巡回活动&#xff0c;旨在通过meetup线下交流形式&#xff0c;解读OpenHarmony作为下一代智能终端操作系统的新版本及成果转化&#xff0c;提升开发者对OpenHarmony的关注度&#xff0c;普及OpenHarmony开发技能&…

高效利用隧道代理实现无阻塞数据采集

在当今信息时代&#xff0c;大量的有价值数据分散于各个网站和平台。然而&#xff0c;许多网站对爬虫程序进行限制或封禁&#xff0c;使得传统方式下的数据采集变得困难重重。本文将向您介绍如何通过使用隧道代理来解决这一问题&#xff0c;并帮助您成为一名高效、顺畅的数据采…

桌面端后台项目笔记

套用模板 vue-pure-admin 所用主要框架笔记 1. electron app const { app } require(electron) app.on(事件名, () > {} // 回调函数)常用事件 will-finish-launching 当应用程序完成基础的启动的时候触发ready&#xff1a;electron完成初始化时触发window-all-close…

A10的pll reconfig

一、前言 我之前写过《quartus动态配置pll reconfig》&#xff0c;讲的是A5的pll reconfig。 这次调A10&#xff0c;结果发现寄存器配置、地址、操作流程都变了&#xff0c;不能无脑移植。 二、寄存器配置 1&#xff0c;A5的寄存器配置如下&#xff1a; 其中基地址如下&…

皮卡丘靶场搭建遇到的问题大全

该博客记录我在安装皮卡丘靶场中遇到的一些问题。 1、 phpstudy_pro启动Mysql失败 自己电脑开启了mysql服务&#xff0c;使用winr&#xff0c;services.msc&#xff0c;找到自己的mysql服务&#xff0c;关闭。再次尝试使用phpstudy_pro启动mysql&#xff0c;成功解决。 2、皮…

基于Matlab实现生活中的图像信号分类(附上源码+数据集)

在我们的日常生活中&#xff0c;我们经常会遇到各种各样的图像信号&#xff0c;例如照片、视频、图标等等。对这些图像信号进行分类和识别对于我们来说是非常有用的。在本文中&#xff0c;我将介绍如何使用Matlab来实现生活中的图像信号分类。 文章目录 介绍源码数据集下载 介…

ElasticSearch学习5-- 使用RestClient查询文档

1、查询基本步骤 1、创建SearchRequest对象 2、准备Request.source()&#xff0c;也就是DSL。 QueryBuilders来构建查询条件 传入Request.source() 的 query() 方法 3、发送请求&#xff0c;得到结果 4、解析结果&#xff08;参考JSON结果&#xff0c;从外到内…

美团 Flink 资源调度优化实践

摘要&#xff1a;本文整理自美团数据平台计算引擎组工程师冯斐&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分&#xff1a; 相关背景和问题解决思路分析资源调度优化实践后续规划 点击查看原文视频 & 演讲PPT 一、相关背景和问题 在…

OpenSSL 远程代码执行漏洞 CVE-2022-1292 升级方案及步骤

升级方案 升级步骤 1.查看版本号 命令:openssl version 2.下载安全版本openssl: openssl官网 下载 openssl-1.1.1o.tar.gz 3.编译安装 在/usr/lib/下创建目录openssl 输入命令: mkdir openssl 将下载的包openssl-1.1.1o.tar.gz放到这个目录,并解压 输入命令: tar -xv…

SAP 之IMG/SPRO解释

一、IMG是什么 二、使用步骤 1.举例 总结 一、IMG是什么 IMG-IMplementation Guide&#xff0c;是实施指引的简称&#xff0c;事务代码是 SPRO-SAP Project Reference Object。IMG是SAP中用于定制系统以满足业务要求的工具&#xff0c; 二、使用步骤 1.举例 例如&#xff0c…

保姆级教程之SABO-VMD-SVM的西储大学轴承诊断

之前写过一篇优化核极限学习机的轴承诊断&#xff0c;今天再出一期基于SVM的轴承诊断。 依旧是包含了从数据处理&#xff0c;到减法优化器SABO算法优化VMD参数&#xff0c;再到支持向量机的故障诊断&#xff0c;实现故障诊断的全流程&#xff0c;其他类型的故障诊断均可参考此流…