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

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

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

 

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

接下来,我们添加“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(太阳)进行“公转”,运行工程效果如下:

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

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

 

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

我们先完成“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肯定会跟随旋转。

其实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哦)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咆哮的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值