• using System.IO; using UnityEngine; public class MyLogCallback : MonoBehaviour { FileInfo fileInfo; string content = "";... FileStream writer;... System.Text.UTF8Encoding encoding;... // ...
    using System.IO;
    using UnityEngine;
    
    public class MyLogCallback : MonoBehaviour {
    
        FileInfo fileInfo;
    
        StreamWriter m_writer;
        System.Text.UTF8Encoding encoding;
        // Use this for initialization
        void Start()
        {
            string path;
    #if UNITY_EDITOR
            path = Application.streamingAssetsPath;
    #else
            path = Application.persistentDataPath;
    #endif
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
    
            path += "/log.txt";
            if (File.Exists(path) == true)
            {
                File.Delete(path);
            }
    
            FileInfo file = new FileInfo(path);
            m_writer = file.CreateText();
    
            Application.logMessageReceived += LogCallback;
    
            DontDestroyOnLoad(gameObject);
        }
    
        void LogCallback(string condition, string stackTrace, LogType type)
        {
            string content = "";
            content += System.DateTime.Now + ":" + type.ToString() + ": " + "\r\n" +
             "condition" + ": " + condition + "\r\n" +
             "stackTrace" + ": " + stackTrace + "\r\n" +
             "--------------------------------------" + "\r\n";
    
         
            m_writer.Write(content);
        }
    
        void Stop()
        {
    #if UNITY_EDITOR
            if (UnityEditor.EditorApplication.isPlaying == false)
            {
                if (m_writer != null)
                {
                    m_writer.Close();
                    m_writer.Dispose();
                }
                Application.logMessageReceived -= LogCallback;
            }
    #endif
        }
        void OnDestroy()
        {
            if (m_writer != null)
            {
                m_writer.Close();
                m_writer.Dispose();
            }
            Application.logMessageReceived -= LogCallback;
        }
    }
    
    
    
    
    展开全文
  • 今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们需要判断炮弹是否击中了敌人,在RPG游戏中我们需要判断玩家是否对敌人造成了...

       大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。

       今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们需要判断炮弹是否击中了敌人,在RPG游戏中我们需要判断玩家是否对敌人造成了伤害,在射击类游戏中我们需要判断子弹是否打中了敌人.......总而言之,在游戏中所谓的打击感就是我们今天要讲的碰撞,从概念上来说,一个物体受到来自其它物体的力的影响并发生位置或者状态上的改变,我们就可以称为碰撞。在Unity3D中系统已经提供了碰撞检测的相关方法,这里我们介绍两种碰撞检测的方法:

       Collision检测:使用Collision检测需要用到下面三个重要的方法:OnCollisionEnter()在刚体与刚体接触时立即调用此方法、OnCollisionStay()在刚体与刚体碰撞中调用此方法、OnCollisionExit()在刚体与刚体碰撞结束时调用此方法。

       Trigger检测使用Trigger检测需要勾选IsTrigger属性,并用到下面的三个重要方法:OnTriggerEnter():开始碰撞、OnTriggerStay():碰撞中 、 OnTriggerExit():结束碰撞。

       那么两种检测方法的区别是什么呢?Collision将造成物理碰撞,Trigger将造成非物理碰撞 。于此同时,请牢记下面的碰撞原则:发生接触(Trigger)的前提是:双方都有碰撞器,且至少一方有刚体,且至少一方勾选了IsTrigger属性。发生碰撞(Collision)的前提是:双方都有碰撞器,且至少一方有刚体。

       下面我们来看一个演示项目,首先创建如图所示的场景。



      

       这里我们对碰撞的目标做了判断,如果我们碰撞的对象的Sphere,则会执行目标对象的脚本中的方法,并输出碰撞信息。目标对象Sphere的脚本和Cube类似,这里就不给出了。最后我们来看结果,如我们所预期的那样,屏幕上打印出了碰撞信息,控制台同样输出了相应的信息。

       在这个演示项目中,我们将使用键盘来控制左边的Cube来碰撞右边的球体,然后再屏幕上打印碰撞信息,在控制台中输出脚本的调用情况。

       首先我们来看为Cube编写的部分脚本代码:

            //一个控制台输出方法
    	public void Log(string msg)
    	{
    	  Debug.Log(msg);
    	}
    	
    	//碰撞开始
    	void OnCollisionEnter(Collision collision)
    	{
    	  if(collision.gameObject.name=="Sphere")
    	  {
    	     Message="进入碰撞,碰撞名称:"+collision.gameObject.name;
    	     collision.gameObject.GetComponent<TargetScript>().Log(Message);
    	  }
    	}
    	
    	//碰撞中
    	void OnCollisionStay(Collision collision)
    	{ 
    	  if(collision.gameObject.name=="Sphere")
    	  {
    	    Message="碰撞中,碰撞名称:"+collision.gameObject.name;
    	    collision.gameObject.GetComponent<TargetScript>().Log(Message);
    	  }
    	}
    	
    	//碰撞结束
    	void OnCollisionExit(Collision collision)
    	{ 
    	  if(collision.gameObject.name=="Sphere")
    	  {
    	    Message="碰撞结束,碰撞名称:"+collision.gameObject.name;
    	    collision.gameObject.GetComponent<TargetScript>().Log(Message);
    	    collision.gameObject.rigidbody.Sleep();
    	  }
    	}



        为什么这里要编写两个输出到控制台的方法呢?因为在实际的游戏开发中,当发生碰撞的时候,我们可能需要作出一些更为实际的事情,比如给敌人减血啦,给我方加血啦,这里只是简单地了解了Unity3D的碰撞机制,Trigger检测和这个基本类似,这里就不再赘述啦,谢谢大家,今天的内容就是这样啦!

             

    展开全文
  • 思路很简单,我们指定一个裁剪高度_ConstructY,如果模型上某个点的的世界坐标高度大于裁剪高度,就discard(擦除)掉,而裁剪高度到边缘光(白色的扫光)高度之间的点,使用指定颜色渲染。然后我们动态改变_...

    思路很简单,我们指定一个裁剪高度_ConstructY,如果模型上某个点的的世界坐标高度大于裁剪高度,就discard(擦除)掉,而裁剪高度到边缘光(白色的扫光)高度之间的点,使用指定颜色渲染。然后我们动态改变_ConstructY,就能实现这个效果。表面着色器代码:

    		void surf (Input IN, inout SurfaceOutputStandard o) {
    			//点的世界坐标高度在裁剪高度下,正常渲染
    			if (IN.worldPos.y < _ConstructY)
    			{
    				fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
    				o.Albedo = c.rgb;
    				o.Alpha = c.a;
    				building = 0;
    			}
    			else
    			{
    				//点的世界坐标高度在裁剪高度下,正常渲染
    				float s = +sin((IN.worldPos.x * IN.worldPos.z) * 240 + _Time[3] + o.Normal) / 120;
    				o.Albedo = _ConstructColor.rgb;
    				o.Alpha = _ConstructColor.a;
    				building = 1;
    				//扫光之上的像素,擦除掉
    				if (IN.worldPos.y > _ConstructY + _ConstructGap + s)
    				{
    					discard;
    				}
    			}
    			o.Metallic = _Metallic;
    			o.Smoothness = _Glossiness;
    		}

    接下来,我们要将扫光禁用光照渲染,而正常显示的部分,使用正常的光照渲染,这里通过building变量来告诉光照模型函数是否正常渲染

    		inline half4 LightingUnlit(SurfaceOutputStandard s, half3 lightDir, UnityGI gi)
    		{
    			if (building)
    			{
    				return _ConstructColor; // 不使用光照模型渲染
    			}
    			if (dot(s.Normal, lightDir) < 0) //避免出现模型空洞
    				return _ConstructColor;
    
    
    			return LightingStandard(s, lightDir, gi); // Unity5 PBR
    		}
    
    
    		inline void LightingUnlit_GI(SurfaceOutputStandard s, UnityGIInput data, inout UnityGI gi)
    		{
    			LightingStandard_GI(s, data, gi);
    		}


    此外,我们要将面裁剪关掉,避免出现模型穿破

    Cull Off

    完整的Shader文件和C#文件:https://pan.baidu.com/s/1bo5CKu7


    展开全文
  • 游戏运行之时打印日志,方便我们查bug,下面我说说自己项目的日志系统怎么弄。 日志等级分别为 LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARNING, LogLevel.ERROR, LogLevel.CRITICAL, LogLevel.EXCEPT。 //获得...

    游戏运行之时打印日志,方便我们查bug,下面我说说自己项目的日志系统怎么弄。

    日志等级分别为

    LogLevel.DEBUG,

    LogLevel.INFO,

    LogLevel.WARNING,

    LogLevel.ERROR,

    LogLevel.CRITICAL,

    LogLevel.EXCEPT。


    //获得类名和方法名

    private static String GetStackInfo()

    {

             StackTrace st = new StackTrace();

             StackFrame sf = st.GetFrame(2);//

             var method= sf.GetMethod();

             return String.Format("{0}.{1}():",method.ReflectedType.Name,method.Name);

    }


    解析:

    我们在学习函数调用时,都知道每个函数都拥有自己的栈空间。一个函数被调用时,就创建一个新的栈空间。那么通过函数的嵌套调用最后就形成了一个函数调用堆栈。在c#中,使用StackTrace记录这个堆栈。你可以在程序运行过程中使用StackTrace得到当前堆栈的信息。


    日记类LoggerHelper

    分别有几个接口:

    LoggerHelper.Debug(string filter, object message, Boolean isShowStack = SHOW_STACK);

    LoggerHelper.Info(string filter, object message, Boolean isShowStack = SHOW_STACK);

    LoggerHelper.Warning(string filter, object message, Boolean isShowStack = SHOW_STACK);

    LoggerHelper.Error(string filter, object message, Boolean isShowStack = SHOW_STACK);

    LoggerHelper.Critical(string filter, object message, Boolean isShowStack = SHOW_STACK);

    LoggerHelper.Except(string filter, object message, Boolean isShowStack = SHOW_STACK);


    统一调用

    Log(string message,LogLevel level ,bool writeEditorLog = ture)

    {

             var msg = string.Concat(DataTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff"),message);

            m_logWriter.WriteLog(msg,level,writeEditorLog);

    }

    如:Log(string.Concat("[DEBUG]:",isShowStack?GetStackInfo():"",message,"Index = ",index++),LogLevel.DEBUG);



    public class LogWriter

    {

          private string m_logPath = UnityEngine.Application.persistentDtaPath + "/log/";

          private string m_logFileName = "log_{0}.txt";

          private string m_logFilePath;

          private FileStream m_fs;

          private StreamWriter m_sw;

          private Action<String,LogLevel,bool> m_logWriter;

          private readonly static object m_locker = new object();


          public LogWriter()

          {

                  if(Directory.Exists(m_logPath))   Directory.CreateDirectory(m_logPath);

             

                  m_logFilePath = String.Concat(m_logPath,String.Format(m_logFileName,DataTime.Today.ToString("yyyyMMdd"));

                  try

                 {

                              m_logWriter = Write;

                              m_fs = new FileStream(m_logFilePath,FileMode.Append,FileAccess.Write,FileShare.ReadWrite);

                              m_sw = new StreamWriter(m_fs)

                  }

                  catch{}


                   //释放资源

                 public void Release()

                 {

                         lock(m_locker)

                        {

                                if(m_sw != null)

                               {

                                        m_sw.Close();

                                        m_sw.Dispose();

                               .....

                 }


                private void Write(string msg,LogLevel level,bool writeEditorLog)

                {

                   lock(m_locker)

                    try

                    {

                              if(m_sw != null)

                              {

                                      m_sw.WriteLine(msg);

                                      m_sw.Flush();

                            }

                     .....

     


           }

    }


    
    
    展开全文
  • Unity3d之截图方法

    2020-06-03 23:30:36
    Unity3d之截图方法,希望对有需要的人有所帮助。
  • 1。无返回值 AndroidJavaClass fee = new AndroidJavaClass("com.wiker.Test"); fee.CallStatic("print", "Hello", "World");     ...public sta...

    1。无返回值
    AndroidJavaClass fee = new AndroidJavaClass("com.
    wiker.Test");

    fee.CallStatic("print", "Hello", "World");

     

     

    Java源代码

    package  com.wiker

     

    public class Test{

     

    public static void print(String str1,String str2){

    System.out.println(str1);

    System.out.println(str2);

    }

    }

     

    java程序将打印

    Hello

    World

     

    2。有返回值

    AndroidJavaClass fee = new AndroidJavaClass("com.wiker.Test");

    stringstr = fee.CallStatic<string>("getStr","Hello", "World");

    Debug.log(str);

     

    Java源代码

    package  com.wiker

     

    public class Test{

     

    public static void getStr(String str1,String str2){

    return str2+" "+str2;

    }

    }

     

    Unity3d控制台将打印Hello world

     

     

    Java调用Unity3d

    UnityPlayer.UnitySendMessage("MainEvent","Success", "");

    将调用MainEvent中的绑定的脚本中的Success方法

    MainEvent是空的GameObject。绑定一个脚本
     

     

    一般Unity调用Java的时候假设须要回调则会用到Java调用Unity3D,如调用支付宝等

    展开全文
  • 3D-unity-wireframe-shader.zip,使用几何体着色器的统一线框材质,3D建模使用专门的软件来创建物理对象的数字模型。它是3D计算机图形的一个方面,用于视频游戏,3D打印和VR,以及其他应用程序。
  • 为了方便在安卓和苹果手机上查看打印,就用GUI仿照unity的Colsole做了一个显示在屏幕上的Colsole,第一次用GUI做的比较简陋,最后有下载地址。 using System.Collections.Generic; using UnityEngine; // ┌...
  • Unity3D常用API

    2017-08-13 14:36:26
    Unity3D常用API总结一. MonoBehaviour类及查询API MonoBehaviour是每个脚本的基类. MonoBehaviour常用方法及调用顺序 //最开始调用,做一些初始化工作。建议少用,此刻物体可能还没有实例化出来,会影响程序执行...
  • 一、前言  在屏幕上打印游戏中的消息是经常需要的功能,本文实现一个带有一定特色的文字消息打印,效果如图所示:消息列表框会根 ...该效果是在Unity的UGUI里实现,一个文本Text显示控件+一个背景图就可以...
  • 今天在调试的时候,将一个鼠标事件打印到控制台,但是发现每个事件只打印一次。一开始还以为逻辑写错了只执行了一次,最后发现,在console窗口的左上角有一个“Collapse”选项,如果选上的话,那么连续的相同日志将...
  • unity3d控制台输出

    2019-07-26 17:00:47
  • using UnityEngine; using System.IO; using System; public class Debuger : MonoBehaviour { public static bool EnableLog;... public static bool EnableTime = false;... public static bool EnableSave
  • 本章我们一起来看下怎样将unity中的fbx模型转成stl模型并且保存到本地。 原理:stl模型都是由三角面组成的,只要我们了解stl文件的格式,就能够轻松的将fbx模型转换成stl。 1、先获取到fxb模型在Unity中的模型组件...
  • 一、前言 这是我看到的一片比较完整的讲自定义窗口,自定义组件的教程,讲的比较详细,特意转过来给大家分享一下 二、原文 ...利用学到的东西制作自己的工具(自定义的窗口、Inspector、菜单等等)。...
  • Unity3d_lua打印管理

    2019-12-06 11:40:28
    昨晚手机进水了,早上心情非常不好,才发现手机可能是比你老婆陪伴你还久的物件,这么说或者很不...(具体什么功能也和一般打印没什么两样,很普通,就是能打印堆栈) -- 打印lua堆栈信息 function printCallSt...
  • 虽然unity3d也有自带触屏的方法,但是使用起来代价太高,什么单击,双击这些功能都要自己封装。 下面我们来讲下EasyTouch这个插件,它将所有触屏的手势,都已经写好了。 而且Easytouch也支持NGUI,使用起来...
  • 在开发中,特别是unity的跨平台中,我们经常会在各个平台游走,如安卓版,苹果版,PC版......。在此不同的平台上,有可能我们需要做不同的操作。然而我们就可以用unity的自带的平台宏定义方式来做平台的判断。Unity...
  • 移动端打印输出信息,IOS和Android端均可,三指在屏幕上半部分轻触发即可。
1 2 3 4 5 ... 20
收藏数 3,743
精华内容 1,497
关键字:

3d打印 unity3d