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]
这两行的目的其实就是定义了两个类别,即
capsuleGameObject 和 cubeComponent 。
当然这两个类的的性质有一点不同啦:
———————超重要———————
前者是 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 控制物体绕自身的x,y,z 轴旋转,transform.Rotate()
- Unity摇杆控制物体移动c#脚本
- 面向组件编程之Unity 7.怎样脚本控制物体旋转和移动 关键字:画圆&&Translate/transform.Translate,transform.Rotate
- Unity用键盘控制物体左右旋转前后移动的c#脚本
- 控制unity对象下所有子物体的显示状态
- Unity之一天一个技术点(十四)---通过鼠标控制镜头绕着某物体旋转
- unity 中 c# 与 object-c 交互
- Unity 物体根据鼠标移动而转动
- 我的Unity(10)一点一滴 利用UI制作摇杆控制物体移动
- Unity编程回忆录之控制物体移动
- unity之RotateAround 一个物体围绕另外一个物体旋转
- Unity使用代码控制2d游戏物体(一)
- Unity 3D 控制物体前后左右均匀移动脚本
- unity 点击鼠标左键控制物体360展示
- unity。。。完美简单解决靠鼠标在屏幕上的移动来控制相机水平,垂直旋转的c#脚本
- Unity 3D 控制物体上下左右均匀移动脚本
- Unity 陀螺仪姿态识别、 控制物体旋转移动
- unity 实现键盘控制物体移动和转向
- 【小松教你手游开发】【unity实用技能】控制renderQueue解决NGUI与Unity3D物体渲染顺序问题
- Unity用鼠标控制物体移动