unity3d 创建图片 脚本_unity3d创建物体直接带脚本 - CSDN
  • unity3d UV动画脚本

    2020-07-30 23:32:07
    unity3d UV动画脚本,可以调节贴图的UV动画 X Y 的移动和速度都可以调整
  • 这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难。这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友学会如何更好的写游戏...
    这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难。这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友学会如何更好的写游戏脚本,当然本文这紧紧是我这么多年对游戏开发的认知,你也可以有你自己的看法。首先我们看看游戏主要是由哪几部分组成的,如下图所示,任何平台下的任何游戏核心都是由:数据、逻辑、渲染三大部分组成。

    当你写过》=2个平台下的游戏时你会发现其实游戏开发很“容易”,为什么“容易”呢?因为此时你会发现所有平台下开发游戏的模式,如下图中的“数据”与“逻辑”两部分真的是完全一样的,这两部分是与游戏开发平台无关的。然而真正与游戏平台有关的紧紧是“渲染”这部分,因为各个游戏平台下的渲染接口是不同的。这也就印证了一点,能把J2ME游戏写好的程序员就必然能把IOS或Android游戏同样的写好。读到这里请结合一下你的公司情况,你可能会发现在你的技术总监两三天就能上手Unity3D游戏开发 Cocos2d游戏开发,这并不是他对游戏平台研究的透彻,而是他对游戏数据的掌控能力非常强,所以能很快玩转各个平台下的开发。

     

             如下图所示,Unity3D这套游戏引擎在游戏开发中的权重如图中所示。其中包含100%的渲染部分 +50%左右的逻辑部分。(因为Unity3D封装了很多与逻辑相关的API供开发者使用)



     

            下面我们回到Unity3D脚本架构的编写上,我们知道Unity3D在是可以创建游戏场景的,在每个游戏场景中又可以创建游戏对象,把每个场景的游戏对象融合在一起就是一款3D游戏。游戏场景之间属于同等级的关系,为了让游戏场景之前交互我们需要有一个凌驾所有场景之上的脚本,我称之为“全局脚本”。如下图所示,所有场景都能与这个唯一的全局脚本进行交互。举个例子,当场景切换时可将临时逻辑数据写入全局脚本中,切换完毕后再去全局脚本中取之前保存的数据,从而实现交互。(当然还有别的办法也能实现这个效果,但是我觉得这样做会更好一些,数据会更安全一些)



     

             接着我们就进入场景中,游戏场景是由若干游戏对象组成,下面我好好说一说游戏对象。游戏对象是需要绑定游戏脚本才能完成它的生命周期。那么脚本的使命就会尤其的重要。因为游戏对象比较多那么脚本必然会出现交互的情况,如下图所示,很多初期Unity3D的项目中的脚本会编写成这个样子。错综复杂相互交互,这样编写的脚本有可能你的游戏能做出来,可是你在维护的时候团队开发的时候你会发现你的脚本非常的混乱,别的同事想改都不知道怎么改。(显然这样的作法时完全错误的)



     

             我们想想为什么脚本之间要交互,原因很简单。是因为脚本中需要使用/调用另一条脚本或者另一条脚本对应的游戏对象某一项数据/方法,为了解决这个问题而导致最终的脚本非常混乱。为了避免这个问题,我在开发中会这么做,如下图所示,脚本之间切记不要做直接的相互交互,脚本之间只做间接的交互。每一个游戏场景都有一个凌驾所有游戏对象之上的单例脚本,在这条脚本中保存场景中所有脚本的公共数据。包括该场景的整体逻辑更新都是在这条单例脚本中完成。每条脚本都只与这个单例脚本做交互,和别的脚本一概不交互。(间接交互)



     

             编写脚本时请注意,脚本只干属于自己最重要的事情,就跟代码中的函数一样,只干最重要的事情。切记和该条脚本无关的事情不要去管,不要在脚本中做过多的相互连带工作,让所有连带工作的话都放在全局单例脚本中来做。

      这里我们举一个例子,主角砍怪或技能攻击怪,怪物受伤只到怪死亡以后屏幕播放一段胜利动画。

    1.主角对象发动攻击,全局单例脚本接受按键事件后通知主角脚本播放攻击动画。

    2.敌人对象接受到主角发送攻击消息时开始播放受伤动画,敌人脚本接收到主角的碰撞时询问单例脚本 主角是“普通攻击、还是技能攻击”,接着敌人播放对应的受伤动画,根据攻击类型敌人对象开始减血。

    3.重复上面的操作,当敌人的血量《=0的时。敌人销毁自身对象,并且敌人脚本告诉单例脚本自己已经死亡。此时,单例脚本在调用“胜利动画”对象播放胜利动画效果。

    上述逻辑我是完全按照刚刚图片中所说明的方式来写,这样做就可以很好的避免交互交互混乱的情况,其实开发中的所有类似这种交互的情况都能很好的用这个全局单例脚本来解决。希望广大Unity3D开发爱好者可以和我讨论,因为我知道架构设计没有最好只有更好。嚯嚯!!

     

    文章来源:雨松MOMO程序研究院
    展开全文
  • Unity3D 全局脚本

    2016-10-12 21:54:17
    我们知道Unity3D在是可以创建游戏场景的,在每个游戏场景中又可以创建游戏对象,把每个场景的游戏对象融合在一起就是一款3D游戏。游戏场景之间属于同等级的关系,为了让游戏场景之前交互我们需要有一个凌驾所有场景...
    我们知道Unity3D在是可以创建游戏场景的,在每个游戏场景中又可以创建游戏对象,把每个场景的游戏对象融合在一起就是一款3D游戏。游戏场景之间属于同等级的关系,为了让游戏场景之前交互我们需要有一个凌驾所有场景之上的脚本,我称之为“全局脚本”。如下图所示,所有场景都能与这个唯一的全局脚本进行交互。当场景切换时可将临时逻辑数据写入全局脚本中,切换完毕后再去全局脚本中取之前保存的数据,从而实现交互。(当然还有别的办法也能实现这个效果,但是我觉得这样做会更好一些,数据会更安全一些)
    

    例如:游戏战斗时你获得一定数量的金币,当你返回菜单界面时,你仍然能看见UI界面显示你的金币数量,这就是全局交互。

    又或者,大部分游戏Loding时都只有一个Loading场景,A场景转到B时调用这个场景,B转到C也是调用这个Loading场景,

    那么Loading场景要怎么知道接下来读取哪个场景?当然是通过你将全部场景的名字存到全局变量,然后读取的时候指定了。


    接着我们就进入场景中,游戏场景是由若干游戏对象组成,下面我好好说一说游戏对象。游戏对象是需要绑定游戏脚本才能完成它的生命周期。那么脚本的使命就会尤其的重要。因为游戏对象比较多那么脚本必然会出现交互的情况,如下图所示,很多初期Unity3D的项目中的脚本会编写成这个样子。错综复杂相互交互,这样编写的脚本有可能你的游戏能做出来,可是你在维护的时候团队开发的时候你会发现你的脚本非常的混乱,别的同事想改都不知道怎么改。(显然这样的作法时完全错误的)

     

    游戏中尽量避免这种高耦合的方法,比如由于某些变动,上面图片的脚本4需要修改或者删除,那么也必须更改脚本1,2,3,5与其的交互,不然会出错。

    这种高耦合的方法显然非常累,而且还容易出错,比如你忘了更改脚本3与脚本4的交互,那么就出错。

     

    我们想想为什么脚本之间要交互,原因很简单。是因为脚本中需要使用/调用另一条脚本或者另一条脚本对应的游戏对象某一项数据/方法,为了解决这个问题而导致最终的脚本非常混乱。为了避免这个问题,我在开发中会这么做,如下图所示,脚本之间切记不要做直接的相互交互,脚本之间只做间接的交互。每一个游戏场景都有一个凌驾所有游戏对象之上的单例脚本,在这条脚本中保存场景中所有脚本的公共数据。包括该场景的整体逻辑更新都是在这条单例脚本中完成。每条脚本都只与这个单例脚本做交互,和别的脚本一概不交互。(间接交互)

     

    或者使用消息通知中心来实现解耦也可以:

    (需要注意的是,Unity自带的消息中心很烂,效率不高,也没有订阅功能,需要自己扩展)

     

    编写脚本时请注意,脚本只干属于自己最重要的事情,就跟代码中的函数一样,只干最重要的事情。切记和该条脚本无关的事情不要去管,不要在脚本中做过多的相互连带工作,让所有连带工作的话都放在全局单例脚本中来做。


    第一种方式是使用静态类。适合存储一些全局的变量,如游戏当前关卡、玩家得分等。
    实现方式和普通的C#静态类没有差别。注意使用静态类就没有必要继承MonoBehaviour了。

    如果要实现复杂一些的全局控制,如切换游戏关卡等操作,更常用的方式是使用单例类。
    单例类的实现又分为两种:

    • 继承自MonoBehaviour的单例类
    • 纯C#的单例类

    前者的优点是:

    • 可以在Inspector中显示,便于赋值和查看变量等;
    • 可以利用MonoBehaviour的接口;
    • 可以使用Coroutine。
    • 等等。

    缺点也很多,主流的观点是能不继承MonoBehaviour就不要继承。

    纯C#的单例类

    实现起来简洁,易于理解。

    普通的写法,不考虑多线程

    public class MyClass
    {
        private static readonly MyClass _instance = new MyClass();
        public static Class Instance {
            get {
                return _instance;
            }
        }    

        private MyClass() {}
    }

    线程安全的写法

    检查两次。C#中使用lock关键字。

    public class MyClass
    {
        private static volatile MyClass _instance;
        private static object _lock = new object();

        public static MyClass Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock(_lock)
                    {
                        if (_instance == null)
                            _instance = new MyClass();
                    }
                }
                return _instance;
            }
        }

        private MyClass() {}
    }

    基于MonoBehaviour的单例类
    普通的写法

    利用了Unity的运行机制,从Awake处获取Unity创建的对象作为单例。
    注意在Unity中不要使用new来创建MonoBehaviour实例。

    public class MyClass : MonoBehaviour
    {
        static MyClass _instance;

        void Awake () {
            _instance = this;
        }

        public static MyClass Instance {
            get {
                // 不需要再检查变量是否为null
                return _instance;
            }
        }
    }

    持久化的写法

    在多个场景中保存单例。又有两种方法。

    第一种是使用DontDestroyOnLoad方法,告诉Unity不要销毁实例所在的对象,然后将脚本挂到某个GameObject上:

    public class MyClass : MonoBehaviour
    {
        static MyClass _instance;

        void Awake () {
            _instance = this;
            // 防止载入新场景时被销毁
            DontDestroyOnLoad(_instance.gameObject);    
        }

        public static MyClass Instance {
            get {
                return _instance;
            }
        }
    }

    上面这个方法有个弊端,必须要从挂载了这个单例的GameObject所在的场景启动,否则会找不到GameObject对象。但是开发和测试时我们经常会单独启动一个场景。

    另一种方法会创建一个GameObject,然后将单例挂载到其上:

    public class MyClass : MonoBehaviour {

        static MyClass _instance;

        static public MyClass Instance
        {
            get
            {
                if (_instance == null)
                {
                    // 尝试寻找该类的实例。此处不能用GameObject.Find,因为MonoBehaviour继承自Component。
                    _instance = Object.FindObjectOfType(typeof(MyClass)) as MyClass;

                    if (_instance == null)  // 如果没有找到
                    {                                       
                        GameObject go = new GameObject("_MyClass"); // 创建一个新的GameObject
                        DontDestroyOnLoad(go);  // 防止被销毁
                        _instance = go.AddComponent<MyClass>(); // 将实例挂载到GameObject上
                    }
                }
                return _instance;
            }
        }
    }


    
    
    
    
    
    
    展开全文
  • Sprite 和 Image 的图片更换,其实是差不多的,只是获取的组件差异而已。Sprite 主要获取目标组件包含 的 SpriteRenderer 组件。 Image 获取的是 Image 组件。

    Sprite 和 Image 的图片更换,其实是差不多的,只是获取的组件差异而已。

    Sprite 主要获取目标组件包含 的 SpriteRenderer 组件。
    Image 获取的是 Image 组件。

    具体如下:

    public GameObject obj; // 目标组件
    // Spirte:

    
       SpriteRenderer sr = obj.transform.GetComponent<SpriteRenderer>();
       Sprite sprite = Resources.Load("Textrues/XXX", typeof(Sprite)) as Sprite;
       sr.sprite = sprite;

    // Image:

       Image img = obj.transform.GetComponent<Image>();
       Sprite sp = Resources.Load("Textrues/XXX", typeof(Sprite)) as Sprite;
       img.overrideSprite = sp;

    注意: Resources.Load 会读取Assets中Resources目录下的资源, Resources目录需要手动创建

    展开全文
  • 初学U3D,贵在坚持和总结,一来对平时的知识巩固,二来可以让自己思路更清晰! 希望与更多的U3D爱好者交流学习。     一、动态为对象添加渲染贴图: [csharp] view plaincopyprint?... public class ...

    初学U3D,贵在坚持和总结,一来对平时的知识巩固,二来可以让自己思路更清晰!  希望与更多的U3D爱好者交流学习。

    一、动态为对象添加渲染贴图:

    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class NewBehaviourScript : MonoBehaviour {  
    5.       
    6.     GameObject obj;  
    7.   
    8.       
    9.     void OnGUI()  
    10.     {  
    11.         if(GUILayout.Button("Add",GUILayout.Height(60),GUILayout.Width(110)))  
    12.         {  
    13.             //创建Cube对象   
    14.             obj = GameObject.CreatePrimitive(PrimitiveType.Cube);  
    15.             //移动至指定坐标   
    16.             obj.transform.position = new Vector3(100,100,100);  
    17.             //对象名称   
    18.             obj.name = "Andy";  
    19.             //材质渲染,(Texture)强制转换  
    20.             obj.renderer.material.mainTexture = (Texture)Resources.Load("0");  
    21.         }  
    22.         if(GUILayout.Button("Del",GUILayout.Height(60),GUILayout.Width(110)))  
    23.         {  
    24.             //销毁对象   
    25.             Destroy(obj);  
    26.         }  
    27.     }  
    28. }  
    using UnityEngine;
    using System.Collections;
    
    public class NewBehaviourScript : MonoBehaviour {
    	
    	GameObject obj;
    
    	
    	void OnGUI()
    	{
    		if(GUILayout.Button("Add",GUILayout.Height(60),GUILayout.Width(110)))
    		{
    			//创建Cube对象
    			obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
    			//移动至指定坐标
    			obj.transform.position = new Vector3(100,100,100);
    			//对象名称
    			obj.name = "Andy";
    			//材质渲染,(Texture)强制转换
    			obj.renderer.material.mainTexture = (Texture)Resources.Load("0");
    		}
    		if(GUILayout.Button("Del",GUILayout.Height(60),GUILayout.Width(110)))
    		{
    			//销毁对象
    			Destroy(obj);
    		}
    	}
    }
    

     

     


    二、添加和删除脚本:

    1、首先创建两个脚本,命名为:“Main.cs”和"CubeScript";

    2、然后新建一个Cube ;

    3、打开CubeScript.cs脚本,添加代码,使Cube执行旋转操作;

     

    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class CubeScript : MonoBehaviour   
    5. {  
    6.   
    7.     void Start ()   
    8.     {  
    9.       
    10.     }  
    11.       
    12.     void Update ()   
    13.     {  
    14.         //定义对象 y轴旋转   
    15.         gameObject.transform.Rotate(new Vector3(0,6,0));  
    16.     }  
    17. }  
    using UnityEngine;
    using System.Collections;
    
    public class CubeScript : MonoBehaviour 
    {
    
    	void Start () 
    	{
    	
    	}
    	
    	void Update () 
    	{
    		//定义对象 y轴旋转
    		gameObject.transform.Rotate(new Vector3(0,6,0));
    	}
    }
    


    4、打开Main.cs脚本,写入代码如下:

    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class Main : MonoBehaviour   
    5. {  
    6.       
    7.     //定义全局游戏对象   
    8.     GameObject obj;  
    9.       
    10.     void Start ()  
    11.     {  
    12.         //获取Cube组件   
    13.         obj = GameObject.Find("Cube");  
    14.     }  
    15.       
    16.       
    17.       
    18.     void OnGUI()   
    19.     {  
    20.         if(GUILayout.Button("Move"))  
    21.             {  
    22.                 //为Cube对象添加CubeScript脚本   
    23.                 obj.AddComponent("CubeScript");  
    24.             }  
    25.         if(GUILayout.Button("ReMove"))  
    26.             {  
    27.                 //必须先定义一个Object对象,获取Cube组件的对应脚本  
    28.                 Object Script = obj.GetComponent("CubeScript");  
    29.                 //销毁该脚本   
    30.                 Destroy(Script);  
    31.             }  
    32.     }  
    33.   
    34.       
    35.     void Update ()   
    36.     {  
    37.           
    38.     }  
    39. }  
    using UnityEngine;
    using System.Collections;
    
    public class Main : MonoBehaviour 
    {
    	
    	//定义全局游戏对象
    	GameObject obj;
    	
    	void Start ()
    	{
    		//获取Cube组件
    		obj = GameObject.Find("Cube");
    	}
    	
    	
    	
    	void OnGUI() 
    	{
    		if(GUILayout.Button("Move"))
    			{
    				//为Cube对象添加CubeScript脚本
    				obj.AddComponent("CubeScript");
    			}
    		if(GUILayout.Button("ReMove"))
    			{
    				//必须先定义一个Object对象,获取Cube组件的对应脚本
    				Object Script = obj.GetComponent("CubeScript");
    				//销毁该脚本
    				Destroy(Script);
    			}
    	}
    
    	
    	void Update () 
    	{
    		
    	}
    }
    


     

     

    5、将Main.cs脚本,拖拽至摄像机;

     

    效果可见:

     

    展开全文
  • 一、前言 今天给大家分享一个如何点击图片生成物体的脚本,可以把这个脚本稍微封装一下,以后也可以方便使用...3.创建两个预制体在Resources文件夹 名字就没有改(懒..) 2.新建脚本test01.cs 代码如...

    一、前言

    今天给大家分享一个如何点击图片生成物体的脚本,可以把这个脚本稍微封装一下,以后也可以方便使用。
    主要试用与点击图片时候响应事件,具体用法还要大家多多摸索

    二、效果

    这里写图片描述

    三、正文

    步骤:

    1.新建2个Image

    这里写图片描述这里写图片描述这里写图片描述
    就改下名字,其他属性都不用改

    3.创建两个预制体在Resources文件夹

    这里写图片描述
    名字就没有改(懒…)

    2.新建脚本test01.cs

    代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    
    public class test01 : MonoBehaviour
    {
        //图片名字
        string imageName;
        //预制体对象
        GameObject part;
    
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                //如果获取到对象的话
                if (OnePointColliderObject() != null)
                {
                    //给图片名字赋值
                    imageName = OnePointColliderObject().name;
                    //创建对象
                    InstantObject();
                }
            }
        }
    
        /// <summary>
        /// 点击对象
        /// </summary>
        /// <returns>点击对象获取到对象的名字</returns>
        public GameObject OnePointColliderObject()
        {
            //存有鼠标或者触摸数据的对象
            PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
            //当前指针位置
            eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
            //射线命中之后的反馈数据
            List<RaycastResult> results = new List<RaycastResult>();
            //投射一条光线并返回所有碰撞
            EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
            //返回点击到的物体
            if (results.Count > 0)
                return results[0].gameObject;
            else
                return null;
        }
    
        public void InstantObject()
        {
            switch (imageName)
            {
                case "Image_1":
                    GameObject obj01 = (GameObject)Resources.Load("Cube");
                    part = Instantiate(obj01, Vector3.zero, obj01.transform.rotation);
                    break;
                case "Image_2":
                    GameObject obj02 = (GameObject)Resources.Load("Sphere");
                    part = Instantiate(obj02, Vector3.up, obj02.transform.rotation);
                    break;
                default:
                    break;
            }
        }
    }
    
    
    

    代码比较简单,就不多说了,都有注释。
    主要讲一下OnePointColliderObject这个函数中的

    • EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
    • RaycastAll的主要特性就是使用光线投射碰撞:在还没有发生真正的物理碰撞之前,就响应碰撞。
    • public void RaycastAll(PointerEventData eventData, List raycastResults);

    OK,大家可以试一下,有什么新奇的点子也可以留言哦

    展开全文
  • unity3D 2017版本 为啥我在assets文件夹下手动创建一个Test.js 在控制台一直红色感叹号 不让我绑定脚本到物体 ![图片说明](https://img-ask.csdn.net/upload/202001/10/1578653879_136722.png) 而且点击后没有进入...
  • Unity脚本生成图片

    2016-10-17 15:47:40
    首先先上脚本生成图片的效果图: 当然还可以根据参数有所改变。 下面开始逐步分析: 1.线性变化,颜色控制在黑白(y=|1-x|,1>=x>=0) 首先,贴下代码: 直接看代码可能不大好理解,下面我们具体化一下...
  • 使用说明: 在Assets文件夹下创建Editor文件夹,将复制或拷贝该代码保存成TextureImportSetting.cs放入Editor文件夹,将该脚本放入该文件夹选择需要批量设置的贴图,单击Costom/Texture Import ...unity3d脚本批量更改图
  • 坚持 成长 每日一篇
  • Unity3D 脚本参考

    2012-02-01 09:06:56
    Unity3D 脚本参考 核心提示:一、脚本概览这是一个关于Unity 内部脚本如何工作的简单概览。Unity 内 部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同志的函数被 特定的事件调用。最常用...
  • Unity3D动态创建地形网格(一) 这次简单的写一个动态创建地形网格的脚本给大家分享一下。 这次是第一部分,仅仅实现了通过高度图动态生成地形的部分。假如以后有心情和时间,再来慢慢的补充多通道刷地形材质、...
  • Unity VS 创建脚本自动添加头注释-时间-描述-作者等信息 Unity生成脚本自动添加头注释 助力快速完成 Unity 创建脚本时自动生成头注信息 Chinar在Unity 工程目录中创建 Editor 文件夹 将该脚本放在 Editor 目录中 ...
  • Unity3D脚本支持中文解决办法/Unity3D脚本编码格式设置: 1》进入unity安装目录\Unity\Editor\Data\Resources\ScriptTemplates,这个文件夹下有81-NewBehaviourScript.cs.txt和80-NewBehaviourScript.js.txt文件,...
  • 游戏脚本需要3D模拟组合,该脚本将被写入阻力3D为了达到效果对象。 以下是一个小实例,使用Unity 3D实现一个可控制移动的小人。小人能够向前、向后、向左和向右移动。 1、通过 File - &gt; New Scene 创建一个...
  • 记录一下这个问题。 原文地址:http://tieba.baidu.com/p/3561719701 object obj = Resources.Load(资源名, typeof(Sprite)); Sprite sp = obj as Sprite; img.sprite = sp; 转载于:...
  • 打开Unity3D软件,它会自动载入上一次我们打开过的“Bootcamp Demo”项目文件。不用管它,在软件打开之后点击 ——> ,在弹出的 对话框中找到 输入创建项目的文件夹地址,或者点击后面的 选择一个文件夹地址(注...
1 2 3 4 5 ... 20
收藏数 5,038
精华内容 2,015
关键字:

unity3d 创建图片 脚本