脚本的初始内容
using UnityEngine;
using System.Collections;
public class MainPlayer : MonoBehaviour {
// 使用此函数进行初始化
void Start () {
}
// 每帧调用一次 Update
void Update () {
}
}
可以将类视为一种蓝图,用于创建可附加到游戏对象的新组件类型。每次将脚本组件附加到游戏对象时,都会创建该蓝图定义的对象的新实例。
类名和文件名必须相同才能使脚本组件附加到游戏对象。
Update 函数是放置代码的地方,用于处理游戏对象的帧更新。这可能包括移动、触发动作和响应用户输入,基本上涉及游戏运行过程中随时间推移而需要处理的任何事项。
Start 函数:在游戏开始之前(即第一次调用 Update 函数之前),Unity 将调用 Start 函数;此函数是进行所有初始化的理想位置。
对象的构造由编辑器处理,不会像您可能期望的那样在游戏运行过程开始时进行。如果尝试为脚本组件定义构造函数,将会干扰 Unity 的正常运行,并可能导致项目出现重大问题。
检测脚本是否运行
// 此函数用于初始化
void Start ()
{
Debug.Log("I am alive!");
}
Debug.Log 是一个简单的命令,只是将消息输出到 Unity 的控制台。如果现在按 Play,应该会在 Unity Editor 主窗口底部以及 Console 窗口(菜单:Window -> General -> Console)中看到此消息。
自定义变量
在 C# 中,必须将变量声明为 public 才能在 Inspector 中查看、改变该变量。
using UnityEngine;
using System.Collections;
public class MainPlayer : MonoBehaviour
{
public string myName;
[SerializeField] //可在Inspector 中查看,实例化。
[Tooltip("按钮")] //对此变量的说明
private Button btn;
// 此函数用于初始化
void Start ()
{
Debug.Log("I am alive and my name is " + myName);
}
}
访问附加到同一游戏对象的其他组件
获取对需要使用的组件实例的引用
如果游戏对象附加了类型为Rigidbody的组件,则将其返回,否则返回 null。
void Start ()
{
Rigidbody rb = GetComponent<Rigidbody>();
}
出于性能原因,最好使用具有 Type 而不是字符串的 GetComponent。 但有时可能无法访问该类型,例如在尝试从 Javascript 访问 C# 脚本时。 在这种情况下,可以仅根据名称而不是类型访问该组件。 示例:
using UnityEngine;
public class ScriptExample : MonoBehaviour
{
void Start()
{
// Disable the spring on the HingeJoint component.
HingeJoint hinge = GetComponent<HingeJoint>();
hinge.useSpring = false;
}
}
设置访问的组件的属性值
获得对组件实例的引用后,可以像在 Inspector 中一样设置其属性的值:
void Start ()
{
Rigidbody rb = GetComponent<Rigidbody>();
// 改变对象的刚体质量。
rb.mass = 10f;
}
在组件实例上调用函数
void Start ()
{
Rigidbody rb = GetComponent<Rigidbody>();
// 向刚体添加作用力。
rb.AddForce(Vector3.up * 10f);
}
完全可以将多个自定义脚本附加到同一对象。如果需要从一个脚本访问另一个脚本,可以像往常一样使用 GetComponent,只需使用脚本类的名称(或文件名)来指定所需的组件类型。
访问其他对象
将游戏对象与变量链接
查找相关游戏对象,最直接方法是向脚本添加公共的游戏对象变量,然后将对象从场景或 Hierarchy 面板拖到此变量上,对其进行分配。
public class Enemy : MonoBehaviour
{
public GameObject player;
void Start() {
// 在玩家角色背后十个单位的位置生成敌人。
transform.position = player.transform.position - Vector3.forward * 10f;
}
// 其他变量和函数...
}
此外,如果在脚本中声明组件类型的公共变量,则可以拖动已附加该组件的任何游戏对象。这样可以直接访问组件而不是游戏对象本身。(???这是什么意思)
public Transform playerTransform;
可以使用数组变量来链接同一类型的多个对象,但仍然必须在 Unity Editor 中(而不是在运行时)进行连接。
寻找子游戏对象
使一组相同类型的游戏对象成为一个父游戏对象的所有子对象,可管理多个游戏对象。可以使用父游戏对象的变换组件来检索子游戏对象(因为所有游戏对象都具有隐式变换):
using UnityEngine;
public class WaypointManager : MonoBehaviour {
public Transform[] waypoints;
void Start()
{
waypoints = new Transform[transform.childCount];
int i = 0;
foreach (Transform t in transform)
{
waypoints[i++] = t;
}
}
}
还可以使用 Transform.Find 函数按名称查找特定子对象: transform.Find(“Gun”); 当对象具有可以在游戏运行过程中添加和删除的子对象时,这种功能可能很有用,;例如可以拾取和放下的武器。
//获取该对象下的Text对象(对象名称为Name)的Text组件
Text objtext = gameObject.transform.Find("Name").GetComponent<Text>();
按名称或标签来查找游戏对象
可使用 GameObject.Find 函数按名称检索各个对象:
GameObject player;
void Start()
{
player = GameObject.Find("MainHeroCharacter");
}
还可以使用 GameObject.FindWithTag 和 GameObject.FindGameObjectsWithTag 函数按标签来查找对象或者对象集合:
GameObject player;
GameObject[] enemies;
void Start()
{
player = GameObject.FindWithTag("Player");
enemies = GameObject.FindGameObjectsWithTag("Enemy");
}