脚本的初始内容

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");
}