美文网首页
第二章 Unity脚本

第二章 Unity脚本

作者: 尘不尘丶 | 来源:发表于2017-04-07 20:35 被阅读0次

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 是否支持多点触碰

相关文章

网友评论

      本文标题:第二章 Unity脚本

      本文链接:https://www.haomeiwen.com/subject/ccqkattx.html