第十四章 Unity 移动和旋转(下)

这篇具有很好参考价值的文章主要介绍了第十四章 Unity 移动和旋转(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章节我们介绍另外两种形式的旋转,也对应了两个方法。首先是RotateAround方法,他是围绕穿过世界坐标中的 point 点的 axis轴旋转 angle 度。这个方法虽然比较晦涩难懂,但是我们使用一个案例,大家就非常明白了。我们创建一个新的“SampleScene5”场景,然后创建一个“Cube”游戏对象和“CubeRotate.cs”脚本,并附加两者在一起。接下来,我们将“Cube”放置到世界坐标系的(-5,0,0)位置,然后我们创建一个“Sphere”球体并放置在世界坐标系原点(0,0,0)位置。

第十四章 Unity 移动和旋转(下)

最后,为了能够观察“Cube”的旋转,我们还需要移动和旋转摄像机,让其在世界坐标系的原点正上方向下俯视整个场景,参数设置入下:

第十四章 Unity 移动和旋转(下)

 第十四章 Unity 移动和旋转(下)

接下来,我们保持相机选中状态,我们点击菜单栏“GameObject”->“Align View to Selected”

第十四章 Unity 移动和旋转(下)

接下来,我们添加“CubeTransformTest2”脚本中的代码

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

public class CubeRotate : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        Vector3 point = new Vector3(0, 0, 0);
        Vector3 axis = new Vector3(0, 1, 0);
        transform.RotateAround(point, axis, 10 * Time.deltaTime);
    }
}

稍微解释一下,point就是世界坐标系原点,也就是Sphere球体的位置。

axis就是Y轴正方向,而point和axis一起就代表了世界坐标系的Y轴。

而RotateAround就是让Cube围绕世界坐标系的Y轴进行旋转,通俗理解就是Cube(地球)围绕Sphere(太阳)进行“公转”,运行工程效果如下:

第十四章 Unity 移动和旋转(下)

最后我们再介绍LookAt方法,它使当前游戏对象向前方向(transform.forward指向 target 的当前位置,类似于转头看向target 位置的操作。我们继续创建“SampleScene6”的新场景,然后创建“Cube”和“CubeLookAt.cs”脚本,并将其附加在一起,“Cube”的位置位于(0,0,0)点。接下来,我们继续创建一个“Sphere”和“SphereTest.cs”脚本,并将其附加在一起,它的位置在(-5,0,0)点。

第十四章 Unity 移动和旋转(下)

然后我们需要调整摄像机的位置和旋转,让其能够在前上方俯视当前场景,摄像机参数如下:

第十四章 Unity 移动和旋转(下)

 第十四章 Unity 移动和旋转(下)

接下来,我们保持相机选中状态,我们点击菜单栏“GameObject”->“Align View to Selected”

第十四章 Unity 移动和旋转(下)

我们先完成“SphereTest.cs”脚本的内容,实现“Sphere”能够沿世界坐标系Z轴移动效果。

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

public class SphereTest : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        // 向前移动
        if (Input.GetKeyDown(KeyCode.W))
        {
            transform.Translate(Vector3.forward, Space.World);
        }

        // 向后移动
        if (Input.GetKeyDown(KeyCode.S))
        {
            transform.Translate(Vector3.back, Space.World);
        }
    }
}

接下来,就是“CubeLookAt.cs”脚本的内容。

因为我们需要让Cube看向Sphere,因此需要在当前脚本中获取到Sphere游戏对象。

让在Update方法中调用LookAt方法来让Cube看向Sphere,代码如下:

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

public class CubeLookAt : MonoBehaviour
{
    // 球体
    GameObject sphere;

    // Start is called before the first frame update
    void Start()
    {
        sphere = GameObject.Find("Sphere");
    }

    // Update is called once per frame
    void Update()
    {
        transform.LookAt(sphere.transform);
    }
}

如果我们移动Sphere的话,Cube肯定会跟随旋转。

第十四章 Unity 移动和旋转(下)

其实LookAt还有第二个参数worldUp,它会将Cube向上方向指向 worldUp;没有该参数的话,就是默认的世界坐标系Y轴。也就是说,Cube向上方向就是Vector3.up。Cube的向上方向本来就是世界坐标系Y轴,因此对我们的案例没有任何的影响。该参数其实是为了调整Cube旋转时候的姿态而已。默认就是Y轴向上的“站立”姿态。

注意:在使用LookAt方法的时候,他会让Cube在X/Y/Z三个轴上看向Sphere,对于X/Z轴的来讲,类似于我们所说的左右旋转,对于Y轴(垂直方向)来讲,这个旋转就不太人性化。因为在现实中,我们会左右旋转看向目标;但是如果目标在上方或者下方的时候,我们只是头部仰视或者俯视,并不会让整个身体进行旋转并看向目标。如何做这样的修改呢?

void Update()
{
        //transform.LookAt(sphere.transform);

        // 位置相减获取方向向量
        Vector3 direction = sphere.transform.position - transform.position;

        // 方向向量去掉Y轴(Y轴清零即可)
        direction = new Vector3(direction.x, 0, direction.z);

        // 使用四元数进行朝向的旋转
        transform.rotation = Quaternion.LookRotation(direction);
}

每句都有相应的注释,这里我们使用了Quaternion.LookRotation方法来完成朝向旋转。接下来,我们在进行测试的时候,即使在Y轴方向移动Sphere,Cube也不会朝向它并旋转了。关于这个案例的效果图,我们就不给到大家了(前提是Y轴上移动Sphere哦)。文章来源地址https://www.toymoban.com/news/detail-477895.html

到了这里,关于第十四章 Unity 移动和旋转(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十四章 MyBatis

    不需要的删除 Springboot自带配置文件 这里的mapper包就相当于三层架构里面的Dao这个包 下面我们测试一下 现在这里我的SQL语句写错了也不会报错 如果没有提示表名或者表爆红了,我们需要进行配置 Hikari是springboot自带的连接池 如果在springboot项目中,我想使用druid连接池 第一步

    2024年01月20日
    浏览(28)
  • 第十四章 代理模式

    CGlib 代理和 jdk 代理的最大区别是不需要 被代理类实现接口,使用方法拦截的形式进行动态代理

    2023年04月26日
    浏览(64)
  • 第十四章 RabbitMQ应用

    一般MQ用于系统解耦、削峰使用,常见于微服务、业务活动等场景。 RabbitMQ整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。 Producer:生产者,就是投递消息的一方。消息一般可以包含2个部分:消息体和标签(Label)。消息的标签用来描述这条消息,比如一个

    2024年01月25日
    浏览(38)
  • 第十四章 ObjectScript - 系统函数

    本节重点介绍 ObjectScript 中一些最常用的系统函数。 这些函数的名称不区分大小写。 类库还提供了大量实用方法,可以像使用函数一样使用它们。 在给定一些输入的情况下,可以使用以下函数来选择一个值: $CASE 将给定的测试表达式与一组比较值进行比较,然后返回与匹配

    2024年02月10日
    浏览(27)
  • Nodejs 第十四章(process)

    process 是Nodejs操作当前进程和控制当前进程的API,并且是挂载到globalThis下面的全局API API 介绍 1. process.arch 返回操作系统 CPU 架构 跟我们之前讲的os.arch 一样 \\\'arm\\\' 、 \\\'arm64\\\' 、 \\\'ia32\\\' 、 \\\'mips\\\' 、 \\\'mipsel\\\' 、 \\\'ppc\\\' 、 \\\'ppc64\\\' 、 \\\'s390\\\' 、 \\\'s390x\\\' 、以及  \\\'x64\\\' 2. process.cwd() 返回当前的工作目

    2024年02月10日
    浏览(23)
  • Android 第十四章 FragmentContainerView

    FragmentContainerView extends FrameLayout FragmentContainerView是专门为Fragments设计的自定义布局。它扩展了FrameLayout,因此它可以可靠地处理Fragment 事务,并且它还具有与Fragment 行为协调的附加特性 FragmentContainerView应用作Fragments的容器,通常设置在活动的xml布局 FragmentContainerView将只允许

    2024年02月11日
    浏览(34)
  • [C国演义] 第十四章

    力扣链接 常见的子数组问题 ⇒ 要使用动态规划的解法 那么要确定dp数组的含义 ⇒ do[i] — — 以 s[i] 结尾的子数组可不可以用 wordDict中的字符串来表示 那么问题来了, 如何判断字符串[j, i] 在没在wordDict中呢? 我们可以用一个 哈希表 . 将wordDict导入一个哈希表中, count 判读一个

    2024年02月08日
    浏览(33)
  • 《微服务实战》 第十四章 RabbitMQ应用

    第十六章 Spring cloud stream应用 第十五章 RabbitMQ 延迟队列 第十四章 RabbitMQ应用 一般MQ用于系统解耦、削峰使用,常见于微服务、业务活动等场景。 RabbitMQ整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。 Producer:生产者,就是投递消息的一方。消息一般可

    2024年02月06日
    浏览(32)
  • 第十四章 使用Vercel部署在线文档

    文档网站需要发布到互联网上才能让更多的人知道。传统的发布方法需要做以下准备。 Linux服务器; 网页服务软件 Nginx; 购买域名 + 实名认证; HTTPS 证书; Sftp 上传工具; Github Action CI 自动发布最新文档。 这里面租用服务器和域名需要一笔花费。安装 Linux、Nginx,配置域名

    2024年02月07日
    浏览(38)
  • 第十四章 TIM基本定时器

    目录 13.1 定时器的分类 13.2 TIM基本定时器简介 13.2.1 定时器的概念和作用 13.2.2 TIM基本定时器的工作原理和使用场景 13.3 TIM基本定时器功能框图 13.3.1 时钟源 13.3.2 控制器 13.3.3 时基(定时器的心脏) 13.3.4 影子寄存器 13.4 TIM基本定时器的初始化和配置方法 13.4.1 定时时间的计算

    2024年02月05日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包