2015-01-25 15:58:06 Sarkozy2014 阅读数 2841
课程名称:Unity3D逆向基础教程第一课

课程类型:Unity3D

课程内容:

1.unity逆向环境搭建

2.unity文件介绍
3.reflector工具使用

课程时长:25分钟

课程作者:Sarkozy

课程大小:【电脑版:142M,手机版:112M】(备注:内容相同,电脑版视频格式为exe,手机版视频格式为flv)

课程备注:额也不知道为什么,录视频会羞涩,大家看的时候不要笑,另外视频中有错误的用语或者有待改进的地方请发私信或者评价。


电脑版下载地址:
http://pan.baidu.com/s/1sjmG2Od
手机版下载地址:
http://pan.baidu.com/s/1c03vVaC


现在本人在逆向未来  www.pd521.com

2016-04-08 10:44:53 qq18052887 阅读数 8824

2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理.


实现原理也很简单:


1.间隔一定时间创建一个残影模型

GameObject go = GameObject.Instantiate(origin, pos, dir) as GameObject;

2.对残影模型采用特殊的shader,要简单高效

    public class MotionGhost
    {
        public GameObject m_GameObject;
        public List<Material> m_Materials;
        public float m_DurationTime;
        public float m_FadeTime;
        public float m_Time;

        public MotionGhost(GameObject go, Color color, float durationTime, float fadeTime)
        {
            m_GameObject = go;
            m_DurationTime = durationTime;
            m_FadeTime = fadeTime;
            m_Time = durationTime;

            if (MotionGhostMgr.Instance.m_MaterialMotionGhost == null)
                MotionGhostMgr.Instance.m_MaterialMotionGhost = Resources.Load("Material/MotionGhost");

            m_Materials = new List<Material>();
            foreach (Renderer renderer in go.GetComponentsInChildren<Renderer>())
            {
                if (renderer as MeshRenderer || renderer as SkinnedMeshRenderer)
                {
                    // 身体和武器
                    Material[] newMaterials = new Material[1];
                    newMaterials[0] = GameObject.Instantiate(MotionGhostMgr.Instance.m_MaterialMotionGhost) as Material;               
                    if (newMaterials[0].HasProperty("_RimColor"))
                        newMaterials[0].SetColor("_RimColor", color);
                    renderer.materials = newMaterials;

                    m_Materials.Add(renderer.material);
                }
                else
                {
                    // 隐藏粒子
                    renderer.enabled = false;
                }
            }
        }
    }


3.残影淡入淡出的处理

        public void Tick()
        {
            for (int i = m_MotionGhosts.Count - 1; i >= 0; --i)
            {
                m_MotionGhosts[i].m_Time -= Time.deltaTime;

                // 时间到了删除掉
                if (m_MotionGhosts[i].m_Time <= 0)
                {
                    GameObject.Destroy(m_MotionGhosts[i].m_GameObject);
                    m_MotionGhosts.RemoveAt(i);
                    --m_Counter;
                    continue;
                }

                // 开始材质渐变
                if (m_MotionGhosts[i].m_Time < m_MotionGhosts[i].m_FadeTime)
                {
                    float alpha = m_MotionGhosts[i].m_Time / m_MotionGhosts[i].m_FadeTime;
                    foreach (Material material in m_MotionGhosts[i].m_Materials)
                    {
                        if (material.HasProperty("_RimColor"))
                        {
                            Color color = material.GetColor("_RimColor");
                            color *= alpha;
                            material.SetColor("_RimColor", color);
                        }
                    }
                }             
            }
        }



残影+扭曲的效果:


残影效果:


2017-06-26 16:29:46 fuemocheng 阅读数 217

转载自 Unity3D研究院之手游开发中所有特殊的文件夹

这里列举出手游开发中用到了所有特殊文件夹。

Unity3D研究院之手游开发中所有特殊的文件夹

1.Editor

Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以。比如目录:/xxx/xxx/Editor 和 /Editor 是一样的,无论多少个叫Editor的文件夹都可以。Editor下面放的所有资源文件或者脚本文件都不会被打进发布包中,并且脚本也只能在编辑时使用。一般呢会把一些工具类的脚本放在这里,或者是一些编辑时用的DLL。 比如我们现在要做类似技能编辑器,那么编辑器的代码放在这里是再好不过了,因为实际运行时我们只需要编辑器生成的文件,而不需要编辑器的核心代码。

2.Editor Default Resources

Editor Default Resources注意中间是有空格的,它必须放在Project视图的根目录下,如果你想放在/xxx/xxx/Editor Default Resources 这样是不行的。你可以把编辑器用到的一些资源放在这里,比如图片、文本文件、等等。它和Editor文件夹一样都不会被打到最终发布包里,仅仅用于开发时使用。你可以直接通过EditorGUIUtility.Load去读取该文件夹下的资源。

TextAsset text = EditorGUIUtility.Load("test.txt")as TextAsset;
Debug.Log(text.text);

3.Gizmos

我觉得这个文件夹其实没什么用处,如下代码所示它可以在Scene视图里给某个坐标绘制一个icon。它的好处是可以传一个Vecotor3 作为图片显示的位置。 参数2就是图片的名子,当然这个图片必须放在Gizmos文件夹下面。

void OnDrawGizmos() {
     Gizmos.DrawIcon(transform.position, "0.png", true);
}

如果只想挂在某个游戏对象身上,那么在Inspecotr里面就可以直接设置。。

这里还是要说说OnDrawGizmos()方法,只要脚本继承了MonoBehaviour后,并且在编辑模式下就会每一帧都执行它。发布的游戏肯定就不会执行了,它只能用于在scene视图中绘制一些小物件。比如要做摄像机轨迹,那么肯定是要在Scene视图中做一个预览的线,那么用Gizmos.DrawLine 和Gizmos.DrawFrustum就再好不过了。

4.Plugins

如果做手机游戏开发一般 andoird 或者 ios 要接一些sdk 可以把sdk依赖的库文件 放在这里,比如 .so .jar .a 文件。这样打完包以后就会自动把这些文件打在你的包中。

5.Resources

可以在根目录下,也可以在子目录里,只要名子叫Resources就可以。比如目录:/xxx/xxx/Resources 和 /Resources 是一样的,无论多少个叫Resources的文件夹都可以。Resources文件夹下的资源不管你用还是不用都会被打包进.apk或者.ipa

Resource.Load :编辑时和运行时都可以通过Resource.Load来直接读取。

Resources.LoadAssetAtPath() :它可以读取Assets目录下的任意文件夹下的资源,它可以在编辑时或者编辑器运行时用,它但是它不能在真机上用,它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。

AssetDatabase.LoadAssetAtPath():它可以读取Assets目录下的任意文件夹下的资源,它只能在编辑时用。它的路径是”Assets/xx/xx.xxx” 必须是这种路径,并且要带文件的后缀名。

我觉得在电脑上开发的时候尽量来用Resource.Load() 或者 Resources.LoadAssetAtPath() ,假如手机上选择一部分资源要打assetbundle,一部分资源Resource.Load().那么在做.apk或者.ipa的时候 现在都是用脚本来自动化打包,在打包之前 可以用AssetDatabase.MoveAsset()把已经打包成assetbundle的原始文件从Resources文件夹下移动出去在打包,这样打出来的运行包就不会包行多余的文件了。打完包以后再把移动出去的文件夹移动回来。

6. StreamingAssets

这个文件夹下的资源也会全都打包在.apk或者.ipa 它和Resources的区别是,Resources会压缩文件,但是它不会压缩原封不动的打包进去。并且它是一个只读的文件夹,就是程序运行时只能读 不能写。它在各个平台下的路径是不同的,不过你可以用Application.streamingAssetsPath 它会根据当前的平台选择对应的路径。

有些游戏为了让所有的资源全部使用assetbundle,会把一些初始的assetbundle放在StreamingAssets目录下,运行程序的时候在把这些assetbundle拷贝在Application.persistentDataPath目录下,如果这些assetbundle有更新的话,那么下载到新的assetbundle在把Application.persistentDataPath目录下原有的覆盖掉。

因为Application.persistentDataPath目录是应用程序的沙盒目录,所以打包之前是没有这个目录的,直到应用程序在手机上安装完毕才有这个目录。

StreamingAssets目录下的资源都是不压缩的,所以它比较大会占空间,比如你的应用装在手机上会占用100M的容量,那么你又在StreamingAssets放了一个100M的assetbundle,那么此时在装在手机上就会在200M的容量。

2015-02-04 10:15:45 qq396225997 阅读数 763

有需求是在完整的apk中截取Android Unity3D并暴露Java的接口。这次文章就是这方面实现的一个小例子。

首先反编译apk,把asserts/bin/manager 文件下的UnityEngine 中的getkey 方法加入调用Android代码的调用:

AndroidJNI.AttachCurrentThread();
    AndroidJNI.PushLocalFrame(0);
    try
    {
        Debug.Log("kyx_keyevent run");
        using (AndroidJavaClass class2 = new AndroidJavaClass("com.kuaiyouxi.keyevent.KYXUnityKeyEvent"))
        {
            object[] args = new object[] { key };
            key = (KeyCode) class2.CallStatic<object>("kyxKeyEvent", args);
        }
    }
    catch (Exception)
    {
        Debug.LogError("kyx_keyevent run");
    }
    finally
    {
        AndroidJNI.PopLocalFrame(IntPtr.Zero);
    }
return GetKeyString(name);

Debug.Log("kyx_keyevent "+(int)key);

Reflector 

package com.kuaiyouxi.keyevent;

import android.util.Log;

public class KYXUnityKeyEvent {
	public static int kyxKeyEvent(int obj){
		Log.e("kyx_keyevent", "run in kyx_keyevent"+obj);
		if(obj == 97 || obj == 100 || obj == 96 || obj == 23){
			obj = 0;
		}
		return obj;
	}
	
	public static String kyxKeyEventString(String obj){
		Log.e("kyx_keyevent", "run in kyx_keyevent"+obj);
		return obj;
	}
	
	public static int kyxKeyDownEvent(int obj){
		Log.e("kyx_keyDownevent", "run in kyx_keyDownevent"+obj);
		if(obj == 97 || obj == 100 || obj == 96 || obj == 23){
			obj = 0;
		}
		return obj;
	}
	
	public static String kyxKeyDownEventString(String obj){
		Log.e("kyx_keyDownevent", "run in kyx_keyDownevent"+obj);
		return obj;
	}
	
	public static int kyxKeyUpEvent(int obj){
		Log.e("kyx_keyUpevent", "run in kyx_keyUpevent"+obj);
		if(obj == 97 || obj == 100 || obj == 96 || obj == 23){
			obj = 0;
		}
		return obj;
	}
	
	public static String kyxKeyUpEventString(String obj){
		Log.e("kyx_keyUpevent", "run in kyx_keyUpevent"+obj);
		return obj;
	}
	
	
	
}

把这个程序编译打包成apk。然后反编译,把上诉代码的smali放进unity3d apk中,打包签名。就可以跑起来了。是不是很简单~

没有更多推荐了,返回首页