您的位置:首页 > 移动开发 > Unity3D

Unity X C#小记之控制Object(物体)的Rotate(转动)

2017-09-20 19:00 399 查看

楔子

其实这个不属于难点,但只是发现似乎是有某些Bug所以我才打算写的。

另外这一部分在制作游戏的时候也是非常重要的,所以我就来写一下ww

这篇文章会和之前的文章有着一点联系,毕竟这次也需要是用上两个C#文件。

所以假如感觉到有什么东西缺失了,就看看我上一篇文章吧( ̄▽ ̄)

注意:个人是零基础学习C#和Unity,在下文可能会有不正确的地方,若有大神指正则是万幸。

教材:Learning C# by Developing Games with
Unity 3D Beginner's Guide by Terry Norton

Unity版本:5.6.1f1

小记

准备篇

场景准备

首先你要在 Scene (场景)里面建立物体,

只要在Scene 旁边的 Hierarchy (层级)栏上右键,看到
3D Object
后选择你喜欢的类型就OK了。

一般来说新建的 Project 会自带 Main Camera (主摄像头) 和 Directional Light
(定向光源),

如果没有的话你也可以用同样的方法建立。

而在教材上是以 Capsule(胶囊体)和 Cube(立方体)这两件 3D Objects 来示例的。

就像下面这样子。



自己截的图,和教材没关系2333

这时只要注意一下 Main Camera 摆位是否能将这两个 Objects 涵盖到视野视野之中就可以的了。

代码准备

这次同样使用了两篇C#文件,其分别是:

LearningScript

Spinner

(真是看文件名就知道是什么意思,另外 LearningScript 这次又出现了2333)

然后将 Spinner 放到两个 Objects 上,也就是 Capsule 和 Cube 上,

而 LearningScript 就还是放到 MainCamera 上吧。

其中 LearningScript 看起来是这样滴:

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

public class LearningScript : MonoBehaviour
{
GameObject capsuleGameObject;
Spinner cubeComponent;

void Start ()
{
capsuleGameObject = GameObject.Find ("Capsule");
Debug.Log (capsuleGameObject);
cubeComponent = GameObject.Find ("Cube").GetComponent<Spinner> ();
Debug.Log (cubeComponent);
}

void Update ()
{
if (Input.GetKey (KeyCode.LeftArrow))
{
capsuleGameObject.GetComponent<Spinner> ().SpinLeft ();
}

if (Input.GetKey (KeyCode.RightArrow))
{
capsuleGameObject.GetComponent<Spinner> ().SpinRight ();
}

if (Input.GetKey (KeyCode.UpArrow))
{
cubeComponent.SpinLeft ();
}

if (Input.GetKey (KeyCode.DownArrow))
{
cubeComponent.SpinRight ();
}
}
}
[align=center]引用且变体于Learning C# by Developing Games with Unity 3D Beginner's Guide, Page 103,Terry Norton.
[/align]

而 Spinner 则是这样子的:

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

public class Spinner : MonoBehaviour
{
public void SpinLeft ()
{
transform.Rotate (1, 1, 1 * Time.deltaTime);
}

public void SpinRight ()
{
transform.Rotate (-1, -1, -1 * Time.deltaTime);
}
}
[align=center]引用且变体于Learning C# by Developing Games with Unity 3D Beginner's Guide, Page 102,Terry Norton.
[/align]



解释篇

主体 LearningScript

首先是这两行 class

GameObject capsuleGameObject;
Spinner cubeComponent;
[align=center][/align]
[align=center]引用且变体于Learning C# by Developing Games with Unity 3D Beginner's Guide, Page 103,Terry Norton.[/align]

这两行的目的其实就是定义了两个类别,即

capsuleGameObjectcubeComponent

当然这两个类的的性质有一点不同啦:

———————超重要———————

前者是 Scene 里面 Objects 的集合

后者则是在 Spinner 里面的。

———————超重要———————

顺带教材原文:

GameObject capsuleGO;
Spinner cubeComp;
[align=center]引用于Learning C# by Developing Games with Unity 3D Beginner's Guide, Page 103,Terry Norton.[/align]

缩写什么的还是不要好了

跟着下来,在 Start () 函数里面,有:

capsuleGameObject = GameObject.Find ("Capsule");
Debug.Log (capsuleGameObject);
cubeComponent = GameObject.Find ("Cube").GetComponent<Spinner> ();
Debug.Log (cubeComponent);

[align=center]引用且变体于Learning C# by Developing Games with Unity 3D Beginner's Guide, Page 103,Terry Norton.[/align]

你可以看到,同样是为了 Find (寻找) Object ,但由于 class 的不同,使得寻找的路径产生了变化。

上半段由于是在 GameObject 这个被密封的类中寻找,所以无须到 Spinner 里面搞事了ww

而下半段则是通过获取 Spinner 元件所附着的 Objects 中寻找具体的内容(也就是 Cube )。

当然,他们在索引完 Object 后都会在 Console 栏 Log 出相应的信息。

在下方的 Update () 函数中:

if (Input.GetKey (KeyCode.LeftArrow))
{
capsuleGameObject.GetComponent<Spinner> ().SpinLeft ();
}

if (Input.GetKey (KeyCode.RightArrow))
{
capsuleGameObject.GetComponent<Spinner> ().SpinRight ();
}

if (Input.GetKey (KeyCode.UpArrow))
{
cubeComponent.SpinLeft ();
}

if (Input.GetKey (KeyCode.DownArrow))
{
cubeComponent.SpinRight ();
}
[align=center]引用且变体于Learning C# by Developing Games with Unity 3D Beginner's Guide, Page 103,Terry Norton.[/align]
[align=left]
[/align]
通过四个if语句判断,当按住对应的方向键后,所需要执行的函数。

在这里也可以以路径的条件,分成两组来看。

上半段的 Capsule 由于是从 GameObject 中调用出来的,所以如果想要执行隔壁的 SpinLeft () / SpinRight () 函数,还是得获取 Spinning 这个元件才可以执行;

而下半段的 Cube 由于是从Spinner 中获取的,则可直接使用 SpinLeft () / SpinRight () 函数。

附属体 Spinner

主要就是两个函数,但两个函数其实是对称的。所以解释一个就等于解释两个。

public void SpinLeft ()
{
transform.Rotate (1, 1, 1 * Time.deltaTime);
}

public void SpinRight ()
{
transform.Rotate (-1, -1, -1 * Time.deltaTime);
}
[align=center]引用且变体于Learning C# by Developing Games with Unity 3D Beginner's Guide, Page 102,Terry Norton.
[/align]

transform即是变换之意,不是transformer变形金刚

后面跟随的Rotate便是转动了。

由于是Unity模拟的是三维世界,所以后面跟着的三个指数分别对应着XYZ三个轴。

后面的 * 则是乘号,Time.deltaTime则是数学定义的 △t 了。

而这个 △t 就是第N帧减去第(N-1)帧的时间差,也就是每一帧之间的时间。

测试篇

若在按下播放后,

Console栏中显示:

Capsule (UnityEngine.GameObject)

UnityEngine.Debug:Log(Object)

Cube (Spinner)

UnityEngine.Debug:Log(Object)

而且,在Scene能够控制两个物体的转动,

便算是成功的了。



自己做的动图。想一想书上怎么会有动图嘛2333

当然,所谓的bug就是...如果Rotate里面XYZ取值太大的话,可能会出现鬼畜的现象...



当XYZ设定为±5时



前半段±10,后半段±60

我用的是GifCam来做动图的,但其帧数限制在33FPS,非常伤心...
所以后面的±120撸下来一点感觉都没有,更别提±1200了,简直sad = =
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity c# 基础 游戏 旋转