Unity3D中C#脚本中常用API
首先,为了避免浪费一些同学的时间,我对本次博客的内容进行说明。(避免一些同学白花时间没有找到自己想看的东西)
本次博客的内容是
1、罗列出常用的几个类,以及他们常用的成员变量和常用方法。
2、挑选出来它们其中的部分我认为比较重要的函数进行说明,并进行编程,并实现一个找柱子的小游戏。
3、总结这几个类的各自功能偏向
一、我们这次要介绍的是哪几个类
Component、Transform、GameObject、Object、time
二、常用类的变量与函数说明
1. Component
1> T GetComponent < T >();
在挂有本脚本的物体上寻找一个组件T
2> T[] GetComponents< T >();
在挂有本脚本的物体上寻找所有组件T
3> T GetComponentInChildren< T >();
从自身开始查找组件T没有就从孩子身上找
4> T[] GetComponentInChildren< T >(true or false);
当参数为true时,查找并返回所有自身和孩子身上的组件T;当参数为false时,取本游戏对象及子物体的所有组件 除开非活跃的游戏对象。
5> T GetComponentInParent< T >();
从自身开始向上查找返回一个自身或父物体的组件。
6> T[] GetComponentsInParent< T >();
从自身开始获取自身和父物体中所有的组件T
2.Transform
变量:positio(物体的世界坐标系)、localPositon(物体相对于父物体的位置)、localScale(物体相对于父物体的缩放比例)、lossyScale(物体相对于模型的缩放比例)、parent(父物体的变换组件)、rotation(相对于世界坐标系物体的旋转角度)。
函数
1> Translate(Vector3)
以自身坐标系为参照,向一个方向移动,加上一个参数Space.World以世界为参照移动
2> SetParent(Transform,bool)
如字面意思,设置物体的父物体,第二个参数为false表示当前物体的位置视为localPosition,否则视为worldPositon
3> Transform Find(“子物体名称”)
通过物体名称查找子物体(如要查找孙子辈的物体,“子物体名称/孙子辈物体名称”)
4> Transform GetChild(int index)
通过物体名称查找子物体(如要查找孙子辈的物体,“子物体名称/孙子辈物体名称”)
5> RotateAround(Vector3 a,Vector3 b,float c)
围绕着a点,以b为轴,旋转c度
6> Rotate(Vector3 a,Space.World)
如果加上Space.World参数,以世界坐标系为参照,绕着a轴自转;如果不加,以自身为参照,绕着a轴自转
7> LookAt(Transform A)
这个方法相当重要,让物体的Z轴周朝向目标A
3.GameObject
变量:activeSelf(物体激活状态)
函数:
SetActive(Bool)
激活/停用游戏对象
AddCompoment(new T)
为游戏物体增加组件T
Find(“物体名称”)
在整个游戏中根据名称查找物体
FindGameObjectsWithTag(“标签名”)
在整个游戏中根据标签查找物体
4.Object
函数:
Destory(Object gameObject,float time)
在time秒后删除游戏对象gameObject。
T Instantiate(new T)
克隆一个物体
T FindObjectOfType()
为游戏中查找一个T类型的对象
T[] FindObjectsOfType()
为游戏中查找所有T类型的对象
5.Time
变量:time(游戏已经运行的时长),deltaTime(这一帧与上一帧之间的时间差)
三、使用以上说明的部分函数进行编程实现一个找柱子的小游戏
游戏功能说明:以俯视视角查看我们得场景,在场景中我们会放4~5个柱子和一个方块,这个方块会自转,然后当我们点击其中一个柱子时,方块会开始绕着点击的柱子旋转。
1.首先我们创建一个这样的场景:
2.我们向方块绑定一个自转脚本,将这个脚本绑定在方块上:
public class RotateCute : MonoBehaviour
{
public Vector3 point; //方块公转围绕点,注意了这里设置权限为public否则你通过其他脚本是无法访问这个point成员变量的
float speed;//每秒旋转的度数
void Start()
{
point = new Vector3(0, 0, 0);
speed = 30.0f;
}
void Update()
{
this.transform.RotateAround(point, new Vector3(0,1, 0), speed*Time.deltaTime); //设置公转
this.transform.Rotate(new Vector3(0,speed*Time.deltaTime,0),Space.World);//设置自转
}
void setPoint(Vector3 point)
{
this.point = point;
}
}
当然你也可以通过在别的脚本中通过各种方式搜索到这个方块对象,然后对方块进行操作。
3.为柱子绑定上鼠标点击,让方块围绕自己旋转的脚本
public class Column : MonoBehaviour
{
int num = 1;
void OnMouseDown()
{
GameObject parent = this.transform.parent.gameObject; //获取父物体对象
for(int i=0;i< parent.transform.childCount;i++)
{ //遍历孩子物体方法一
Transform colum = parent.transform.GetChild(i); //根据下标获取孩子节点
colum.gameObject.GetComponent<Column>().num = 1;
}
this.num = 0; //标记当前的物体
foreach (Transform item in parent.transform)
{ //遍历孩子物体方法二
if (item.gameObject.GetComponent<Column>().num==0)
{
GameObject cute=GameObject.Find("Cube");
cute.GetComponent<RotateCute>().point = item.transform.position;
}
}
}
}
完成以上步骤运行结果如下:
好吧我知道有人会说,你这代码太复杂了,明明1到2行的代码就可以实现的功能要写这么长。没办法啦啊sir,为了尽可能的演示这次学习的函数啊。
还有很多我列举的常用api没有演示。个人觉得没必要,我们只需要对这些api的类有一个总结就行了,这样当我们想到什么功能想要实现的时候只需要优先获取这些类,然后再去查一查帮助文档一般来说问题不大,毕竟代码本来就是拿来练的,不是拿来背的。
四、这几个常用api类功能总结
1.Component
个人认为这个类是用来获取组件的,如下图:
2.Transform
个人认为它的主要功能是用来改变物体的物理信息的,比如大小,位置,角度等等物理信息的。(这个物理可能是我个人的理解偏差,反正它可以用来修改这些信息)
3.GameObject
个人认为它是用来操作游戏对象的,比如禁用启用对象,并且可以添加、查找组件。
4.Object
这个类我暂时还想不出来合适的概括来形容他的功能。
5.Time
对提供游戏的时间信息
五.总结
通过本次学习我熟悉了以上我列举的UnityC#脚本的常用API,从今天开始我所学习的内容也终于可以通过运行的游戏画面来实现了。由于函数比较多,要想熟练使用单单凭一个博客是无法实现的,但是在这之后的学习中我会特意的回顾之前学习的内容,挑选其中我认为不是很熟悉的内容来实现程序的功能。
啊~这样就我离我的目标(学习游戏人工智能的编程,争取通过自己的学习实现智能的游戏AI)又近了一步。