美文网首页
第二章 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