第二章 Unity脚本

Unity 3D脚本

1 创建脚本

1.1 C#脚本

Project视图 右键 > Create > C# Script

using UnityEngine;
public class CSharp : MonoBehaviour{
    
    void Start(){

    }

    void Update(){

    }

}

1.2 JavaScript脚本

Project视图 右键 > Create > Javascript

function Start(){

}

function Update(){

}

以后脚本都以C#为例

1.3 设置脚本自定义图标

选中脚本 -> 点击

2 MonoBehaviour

所有继承MonoBehaviour的类从脚本唤醒到销毁有着完整的生命周期

Awake() 唤醒方法

当游戏对象被创建时调用,无论脚本是否激活都会调用。

Start() 开始方法

脚本第一次激活的时候立即执行(位于Awake()之后执行),只会执行一次(即使重新激活脚本,也不会执行了)。

Update() 更新方法

只要脚本处于激活状态之下,每一帧都会调用Update()

LateUpdate() 延迟更新方法

处于激活状态下,在Update()调用后会调用LateUpdate()

FixedUpdate() 固定更新函数

在游戏运行过程中,每一帧处理的时间是不固定的。当需要固定间隔执行一些代码时就会用到FixedUpdate()函数。也是在激活状态下。
固定调用时间可以在:Edite -> Project Settings -> Time 下的 Fixed Timestep 设置

OnDestory() 销毁事件

当前脚本销毁时调用。

OnDisable() 禁用事件

在脚本被禁用时调用(每次禁用都会调用)

OnEnable() 激活事件

脚本在激活时调用(每次激活都会调用)

OnGUI()

绘制GUI时调用。现在一般不适用此GUI。Untiy有了UGUI

3 调试

Debug.Log() 输出普通信息(白色)
Debug.LogWarning() 输出警告信息(黄色)
Debug.LogError() 输出错误信息(红色)
void Start(){
    Debug.Log("log...");
    Debug.LogWarning("warning....");
    Debug.LogError("error....");
}

4 游戏对象的操作

4.1 创建游戏物体


void Start(){

    // 创建胶囊体
    GameObject.CreatePrimitive(PrimitiveType.Capsule);

}

PrimitiveType类型:

类型 说明
Capsule 胶囊体
Sphere 球体
Cylinder 圆柱体
Cube 正方体
Plane 平面
Quad

4.2 获取游戏对象

通过指定

using System;
using UnityEngine;
public class Test : MonoBehaviour{

    public GameObject myCube;

    void Start(){

    }

}

Hierarchy视图中拖一个游戏物体到My Cube后面;或者点小圆圈选择一个。

同过代码获取游戏对象

using System;
using UnityEngine;
public class Test : MonoBehaviour{

    public GameObject myCube;

    void Start(){
        // 通过游戏名称查找游戏对象
        myCube = GameObject.Find("Cube");
        // 通过标签查找游戏对象
        myCube = GameObject.FindWithTag("Player");
        // 也是通过游戏标签获取一个游戏对象
        myCube = GameObject.FindGameObjectWithTag("Palyer");

        // 通过标签获取多个游戏对象
        var list = GameObject.FindGameObjectsWithTag("cubes");
        
        // 通过类型或游戏对象
        var obj = GameObject.FindObjectOfType(typeof(Rigidbody));

        // 通过类型获取对象
        var lists = GameObject.FindObjectsOfType(typeof(Rigidbody));
    }

}

5 添加组件和修改组件

void Start(){

    // 向当前游戏对象添加一个 刚体组件
    gameObject.AddComponent<Rigidbody>();

    // 获取当前游戏对象上的 刚体 组件
    var rigidbody = GetComponent<Rigidbody>();

    // 修改组件值
    rigidbody.mass = 100;
}

其他组件操作都一样

6 发送消息

游戏对象间通讯

使用GameObject.SendMessage()方法

// 方法名:要在游戏对象中调用的方法;
GameObject.SendMessage(string methodName);
// 方法名 和 要传递的`参数`
GameObject.SendMessage(string methodName, object value);
// 方法名 和 配置项->
GameObject.SendMessage(string methodName, SendMessageOptions option);
SendMessageOptions
DontRequireReceiver 不需要回应
RequireReceiver 必须回应
GameObject.SendMessage(string methodName,object value ,SendMessageOptions option);

游戏对象A代码:

    void Start(){
        // 获取发送消息的游戏对象
        var myCube = GameObject.Find("TestCube");

        if(myCube != null){
            
            // 向获取到的游戏对象发送消息
            myCube.SendMessage("methodName");

        }
    }

TestCube游戏对象中代码:

// 额外添加 methodName 让A对象里的 SendMessage 调用。
public void methodName(){
    print("call....");
}

SendMessageUpWards 向物体和父物体发送消息

BroadcastMessage 对物体和所有子物体发送消息(广播消息)

7 克隆游戏物体 Instantiate方法


// 手动在unity编辑中赋值
public GameObject cube;

void Start(){

    // 克隆cube  第一个参数就是 cube变量  第二个参数:克隆的游戏物体在世界中的这边  第三个参数:不旋转
    var go = Instantiate(cube,Vector3.zero,Quaternion.identity);
}

8 移动、旋转和缩放游戏对象(Transform组件)

每个游戏物体都会有一个Transform组件,这个组件是无法移除的。
Transform面板一共包含3个属性:Position(位置) Rotation(旋转) Scale(缩放)


我们可以用Scene视图工具


来拖动和旋转游戏对象,也可以直接改变Transform组件里的值。

8.1 游戏对象的位置

在3D世界中,任何一个模型的三维坐标都保存在Vector3结构中,该结构保存了 x坐标,y坐标,z这边。改变Vector3结构里面的值,对应场景里面模型也会改变位置。

8.2 移动游戏对象

using UnityEngine;
public class Test : MonoBehaviour{

    void Update(){
        // 直接改变
        transform.position = new Vector3(0, 100, 0);

        // 相当于在游戏对象的当前位置 加上 给定的 Vector3
        transform.Translate(new Vector3(0, 0, 10));

    }

}

8.3 缩放游戏对象

// x为x轴向的缩放,y为y轴向的缩放,z为轴向的缩放
transform.localScale = new Vector3(x, y, z);

// 整体缩放 1.5 倍;
transform.localScale *= 1.5f;

8.4 旋转游戏对象

旋转有两种:

  • 自转
  • 围绕旋转 围绕一个点旋转
// 设置对象自转,按照z轴自转
transform.Rotate(Vector3.forward);

// 围绕一个点旋转  围绕的位置  按照z轴旋转  旋转角度
transform.RotateAround(myCube.transform.position, Vector3.forward, 2);

8.4 工具类

Time类

Time.time 当前游戏时间
Time.timeScale 游戏时间的缩放,当设置为0.5f时,现实过去1秒,游戏过去0.5秒。
Time.deltaTime 上一帧所消耗是时间
Time.fixedTime 每一次执行FiexdUpdate的时间间隔
Time.fixdDeltaTime 固定更新上一帧消耗的时间
Time.realtimeSinceStartup 从游戏开始一直到现在的真实时间,不受Time.Scale影响。

Random类

Random.Range(int min,int max) 生成 min 到 max范围的随机数,返回int
Random.Range(float min,float max) 生成 min 到 max范围的随机数,返回float

8.5 输入控制Input

键盘:

Input.GetKeyDown(KeyCode.W) 按下 W

Input.GetKeyUp(KeyCode.S) 放开 S

Input.GetKey(KeyCode.A) 按住 A

鼠标:

Input.GetMouseButton(0) 鼠标 左键 按住

Input.GetMouseButtonDown(1) 鼠标 右键 按下

Input.GetMouseButtonUp(2) 鼠标 中键 抬起

自定义输入

主菜单 -> Edit -> Project Settings -> Input -> Axes

Size 可以改变Axes下的数量
Horizontal菜单 (其它菜单参数都一样)
4_1.png
Name 名称
Descripttive Name 描述
Descripttive Negative Name 描述负数
Negative Button 负按钮
Positive Button 正按钮
Alt Negative Button 次要 负按钮
Alt Positive Button 次要 正按钮
Gravity 重力 按钮力度
Dead 小于这个数的正值或负值 都将设置为0
Sensitivity 灵敏度
Snap 在接受到相反的输入,将立即重置为0
Invert 反向,正的变负的
Type 输入类型:
Key or Mouse Button 按键
Mouse Movement鼠标移动
Joystick Axis操纵杆
Axis 来自设备的输入轴
Joy Num 使用哪个操纵杆

通过代码来获取(Axis)输入

// 获取`Axes`下 名称为 Horizontal 的输入
float horizontal = Input.GetAxis("Horizontal");

因为Horizontal设置主要按钮为:<-(方向键左) ->(方向键右) 次要按钮:a d
按下(A) horizontal就会时负值 (D) horizontal就是正值

移动设备输入Touch

触碰

fingerId 手指id
phase 手指的阶段
position 按下的坐标

Began 开始接触屏幕
Moved 移动
Stationary 静止
Ended 离开屏幕
Canceled 系统关闭触摸屏
重力感应Acceleration
Vector3 posistion = Input.acceleration

posistion.x 正向为设备向右
posistion.z 正向为设备使用者方式
posistion.y 正向为设备向上

其它相关API
Input.deviceOrientation 当前游戏运行朝向
Input.touchSupported 是否支持手指触碰操作
Input.multiTouchEnable 是否支持多点触碰

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容