通过C#脚本实现旋转的立方体

一、介绍

目的:通过一个简单的例子(鼠标点击,使立方体旋转和变色)熟悉Unity中C#脚本的编写。

软件环境:Unity 2017.3.0f3 、 VS2013。

二、C#脚本实现

1,启动Unity,创建游戏场景。【关于Unity基本操作请点击 Unity入门教程(上)进行了解】

2,在Assets目录下创建文件夹,用于存放游戏的各种资源。

3,创建一个名为CubeRotate的C#脚本并拖放到场景的方块上,调整好相机位置。

4,双击打开脚本,在脚本中加入鼠标相关函数

5,设定一个功能:当鼠标光标移动到物体上时,物体材质色彩变为黄色。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeRotate : MonoBehaviour {

    private bool bCube1 = false;
    private bool bCube2 = false;
    private Color OldColor;

    // Use this for initialization
    void Start () {
        OldColor = this.gameObject.GetComponent<Renderer>().material.color; //获取物体的原始颜色
    }
    
    // Update is called once per frame
    void Update () {
        
    }

    void OnMouseOver()
    {
        this.gameObject.GetComponent<Renderer>().material.color = Color.yellow; //立方体变为黄色
        bCube1 = true;
    }
    void OnMouseExit()
    {
        this.gameObject.GetComponent<Renderer>().material.color = OldColor; //立方体变为原始颜色
        bCube1 = false;
    }
    void OnMouseDown()
    {
        if(bCube1)
        {
            bCube2 = true;
        }
    }

}

代码解读:当鼠标光标移动到物体上时,物体变为黄色,同时将一个初始值为false的bCube1的值变为true;当鼠标光标离开后,物体材质色彩还原,bCube1为false;当按下鼠标左键,且bCube1的值为true,bCube2的值为真。

注:OnMouse函数都是执行一次的函数,因此不能将与动画有关的控制函数放于其内执行,所以通常会用布尔值开关来控制Update函数中的动画函数。

6,在Update函数里实现Cube转动

    void Update () {
        if(bCube2) //当Cube为真时
        {
            this.gameObject.transform.Rotate(Vector3.up * Time.deltaTime * 200);  //Cube转动
        }
    }

因为Cube转动是持续性的,所以把旋转脚本写在Update函数里面实现Cube转动。

7,更改Spotlight的强度

    // Use this for initialization
    void Start () {
        OldColor = this.gameObject.GetComponent<Renderer>().material.color; //获取物体的原始颜色
        GameObject.Find("Spotlight").GetComponent<Light>().intensity = 1.0F;  //获取Spotlight的强度属性
    }
    
    // Update is called once per frame
    void Update () {
        if(bCube2) //当Cube为真时
        {
            this.gameObject.transform.Rotate(Vector3.up * Time.deltaTime * 200);  //Cube转动
            if(GameObject.Find("Spotlight").GetComponent<Light>().intensity < 8.0F)
            {
                GameObject.Find("Spotlight").GetComponent<Light>().intensity += 0.05F;
            }
        }
    }

8,UGUI的使用->添加Text组件

9,添加控制Text显示的脚本

使用UGUI组件必须在C#脚本中添加UI的命名空间,这样我们才能引用。当bCube2的值为真时,Text组件显示“Cube正在旋转中...”,所以在Update函数的if语句里面应添加以下脚本

            GameObject.Find("Text").GetComponent<Text>().text = "Cube正在旋转...";

10,点击“Play”按钮,运行游戏

鼠标点击前:

鼠标点击后:

11,完整脚本代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  //添加UI的命名空间

public class CubeRotate : MonoBehaviour {

    private bool bCube1 = false;
    private bool bCube2 = false;
    private Color OldColor;

    // Use this for initialization
    void Start () {
        OldColor = this.gameObject.GetComponent<Renderer>().material.color; //获取物体的原始颜色
        GameObject.Find("Spotlight").GetComponent<Light>().intensity = 1.0F;  //获取Spotlight的强度属性
    }
    
    // Update is called once per frame
    void Update () {
        if(bCube2) //当Cube为真时
        {
            this.gameObject.transform.Rotate(Vector3.up * Time.deltaTime * 200);  //Cube转动
            GameObject.Find("Text").GetComponent<Text>().text = "Cube正在旋转...";

            if(GameObject.Find("Spotlight").GetComponent<Light>().intensity < 8.0F)
            {
                GameObject.Find("Spotlight").GetComponent<Light>().intensity += 0.05F;
            }
        }
    }

    void OnMouseOver()
    {
        this.gameObject.GetComponent<Renderer>().material.color = Color.yellow; //立方体变为黄色
        bCube1 = true;
    }
    void OnMouseExit()
    {
        this.gameObject.GetComponent<Renderer>().material.color = OldColor; //立方体变为原始颜色
        bCube1 = false;
    }
    void OnMouseDown()
    {
        if(bCube1)
        {
            bCube2 = true;
        }
    }

}

三、总结

通过学习我们了解了C#脚本对于游戏对象的作用,中间还学习了UGUI的使用。

Unity脚本语言的综合应用并不是通过一个实例就能够达到熟练的程度,还需要自己不断地练习和探索,不断的尝试bug和及时总结。 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发之途

Android IPC机制(2)-AIDL

1264
来自专栏魂祭心

原 荐 以太坊 p2p Server 原理及

4855
来自专栏大内老A

通过扩展改善ASP.NET MVC的验证机制[实现篇]

在《使用篇》中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离、多语言的支持和多验证规则的支持,我们现在来看看这样的验证解决方案最...

18610
来自专栏FreeBuf

FlaskJinja2 开发中遇到的的服务端注入问题研究 II

0x00. 前言 本篇文章是 《Flask Jinja2 开发中遇到的的服务端注入问题研究》<点击阅读原文查看链接>续篇,我们继续研究 Flask Jinja...

2666
来自专栏iOS 开发杂谈

iOS RunTime之六:Category

Category 是 Objective-C 2.0 之后添加的特性,一般我们使用 Category 的场景主要可以动态地为已经存在的类扩展新的属性和方法。这样...

582
来自专栏進无尽的文章

编码篇-低耦合代码注入

我下面要将的内容也许网上已经有很多相关的介绍了,但是我还是会写出这篇文章,一来是对自己学习的总结,虽然总结的有些晚,如果你仔细看,会发现我的文章有别处没有的内容...

832
来自专栏Create Sun

基础拾遗------特性详解【含常用过滤器实例】

前言  本来7月份想着是用一个月把基础拾遗写完的,结果断断续续写了4个月了,才写了这几篇,这两天又规划着多写几篇,希望能坚持吧。前两天一次和同事聊天提到了特性...

34417
来自专栏大内老A

来源于WCF的设计模式:可扩展对象模式[下篇]

在《来源于WCF的设计模式:可扩展对象模式》我通过一个简单的例子介绍了基于IExtensibleObject<T>和IExtension<T>这两个接口为核心的...

2228
来自专栏大闲人柴毛毛

张全蛋和李小花的故事——“代理模式”

举个例子: 假设张全蛋喜欢上了李小花,张全蛋准备给李小花送一些礼物,但张全蛋又非常害羞,因此买了礼物之后让王尼玛代送。王尼玛跑到李小花把礼物送给她之后就走了。 ...

35212
来自专栏nice_每一天

Java爬虫

jsoup-1.7.3.jar 个人认为爬虫的实现机制: 获取Docume对象—>获取节点—>输出或者持久化

853

扫码关注云+社区