Unity Remote与Snow Leopard下Unity for iPhone冲突的解决

调试Unity for iPhone的游戏时候时常莫名其妙的卡死,能正常使用也得看运气.官方Unity for iPhone v1.6的更新日志里也写了这是已知问题.存在于苹果雪豹系统中.官方也一直没修正这个问题.不会要等到Unity3.0发布吧.别啊..

几经搜索后得到一些消息,比如降级回Leopard,给iPhone使用2.2.1OS,可这些都不靠谱.谁不升级用新的啊?!对不?呵呵.

打开Unity Remote项目文件.找到Setup.h,将默认的一些帧率,画质等进行降低设置.Remote端的图像是Jpg,默认压缩率是50,将它降低些,比如25,修改JpegQuality处.如果你不需要重力感应调试可以将它的帧率调整为0,也可以降低整体图像的帧率.我进行这样的设置 FPS = 40, AccelerometerFPS = 15.

Build到iPhone,应该会改良很多.希望大家一起探讨解决开发中遇到的各种问题.

将Unity3D中的地形导出为*.Obj模型文件

将下面的脚本放在你项目目录下资源文件夹的Editor里.
要导出地形,首先在你的场景中选中地形对象.如果没选,他将用于当前场景中可用的地形.从Terrain菜单下选择Export To Obj… ,在分辨率窗口,选择你要四边形还是三角形网格结构.同样也可以选择要导出地形的分辨率,有高中低等等.点击Export,选择要保存的位置和文件名.Obj文件将被导出.要注意如果选择大面积的Full地形导出,最终的Obj文件将非常大,而且也要导出很久.

下面为ExportTerrain.js脚本.

import System.IO;
import System.Text;

enum SaveFormat {Triangles, Quads}
enum SaveResolution {Full, Half, Quarter, Eighth, Sixteenth}

class ExportTerrain extends EditorWindow {
    var saveFormat = SaveFormat.Triangles;
    var saveResolution = SaveResolution.Half;
    static var terrain : TerrainData;
    static var terrainPos : Vector3;
    
    var tCount : int;
    var counter : int;
    var totalCount : int;
    
    @MenuItem ("Terrain/Export To Obj...")
    static function Init () {
        terrain = null;
        var terrainObject : Terrain = Selection.activeObject as Terrain;
        if (!terrainObject) {
            terrainObject = Terrain.activeTerrain;
        }
        if (terrainObject) {
            terrain = terrainObject.terrainData;
            terrainPos = terrainObject.transform.position;
        }
        EditorWindow.GetWindow(ExportTerrain).Show();
    }
    
    function OnGUI () {
        if (!terrain) {
            GUILayout.Label("No terrain found");
            if (GUILayout.Button("Cancel")) {
                EditorWindow.GetWindow(ExportTerrain).Close();
            }
            return;
        }
        saveFormat = EditorGUILayout.EnumPopup("Export Format", saveFormat);
        saveResolution = EditorGUILayout.EnumPopup("Resolution", saveResolution);
        
        if (GUILayout.Button("Export")) {
            Export();
        }
    }
    
    function Export () {
        var fileName = EditorUtility.SaveFilePanel("Export .obj file", "", "Terrain", "obj");
        var w = terrain.heightmapWidth;
        var h = terrain.heightmapHeight;
        var meshScale = terrain.size;
        var tRes = Mathf.Pow(2, parseInt(saveResolution));
        meshScale = Vector3(meshScale.x/(w-1)*tRes, meshScale.y, meshScale.z/(h-1)*tRes);
        var uvScale = Vector2(1.0/(w-1), 1.0/(h-1));
        var tData = terrain.GetHeights(0, 0, w, h);
        
        w = (w-1) / tRes + 1;
        h = (h-1) / tRes + 1;
        var tVertices = new Vector3[w * h];
        var tUV = new Vector2[w * h];
        if (saveFormat == SaveFormat.Triangles) {
            var tPolys = new int[(w-1) * (h-1) * 6];
        }
        else {
            tPolys = new int[(w-1) * (h-1) * 4];
        }
        
        // Build vertices and UVs
        for (y = 0; y < h; y++) {
            for (x = 0; x < w; x++) {
                tVertices[y*w + x] = Vector3.Scale(meshScale, Vector3(x, tData[x*tRes,y*tRes], y)) + terrainPos;
                tUV[y*w + x] = Vector2.Scale(Vector2(x*tRes, y*tRes), uvScale);
            }
        }
    
        var index = 0;
        if (saveFormat == SaveFormat.Triangles) {
            // Build triangle indices: 3 indices into vertex array for each triangle
            for (y = 0; y < h-1; y++) {
                for (x = 0; x < w-1; x++) {
                    // For each grid cell output two triangles
                    tPolys[index++] = (y     * w) + x;
                    tPolys[index++] = ((y+1) * w) + x;
                    tPolys[index++] = (y     * w) + x + 1;
        
                    tPolys[index++] = ((y+1) * w) + x;
                    tPolys[index++] = ((y+1) * w) + x + 1;
                    tPolys[index++] = (y     * w) + x + 1;
                }
            }
        }
        else {
            // Build quad indices: 4 indices into vertex array for each quad
            for (y = 0; y < h-1; y++) {
                for (x = 0; x < w-1; x++) {
                    // For each grid cell output one quad
                    tPolys[index++] = (y     * w) + x;
                    tPolys[index++] = ((y+1) * w) + x;
                    tPolys[index++] = ((y+1) * w) + x + 1;
                    tPolys[index++] = (y     * w) + x + 1;
                }
            }  
        }
    
        // Export to .obj
        try {
            var sw = new StreamWriter(fileName);
            sw.WriteLine("# Unity terrain OBJ File");
            
            // Write vertices
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
            counter = tCount = 0;
            totalCount = (tVertices.Length*2 + (saveFormat == SaveFormat.Triangles? tPolys.Length/3 : tPolys.Length/4)) / 1000;
            for (i = 0; i < tVertices.Length; i++) {
                UpdateProgress();
                var sb = StringBuilder("v ", 20);
                // StringBuilder stuff is done this way because it's faster than using the "{0} {1} {2}"etc. format
                // Which is important when you're exporting huge terrains.
                sb.Append(tVertices[i].x.ToString()).Append(" ").
                   Append(tVertices[i].y.ToString()).Append(" ").
                   Append(tVertices[i].z.ToString());
                sw.WriteLine(sb);
            }
            // Write UVs
            for (i = 0; i < tUV.Length; i++) {
                UpdateProgress();
                sb = StringBuilder("vt ", 22);
                sb.Append(tUV[i].x.ToString()).Append(" ").
                   Append(tUV[i].y.ToString());
                sw.WriteLine(sb);
            }
            if (saveFormat == SaveFormat.Triangles) {
                // Write triangles
                for (i = 0; i < tPolys.Length; i += 3) {
                    UpdateProgress();
                    sb = StringBuilder("f ", 43);
                    sb.Append(tPolys[i]+1).Append("/").Append(tPolys[i]+1).Append(" ").
                       Append(tPolys[i+1]+1).Append("/").Append(tPolys[i+1]+1).Append(" ").
                       Append(tPolys[i+2]+1).Append("/").Append(tPolys[i+2]+1);
                    sw.WriteLine(sb);
                }
            }
            else {
                // Write quads
                for (i = 0; i < tPolys.Length; i += 4) {
                    UpdateProgress();
                    sb = StringBuilder("f ", 57);
                    sb.Append(tPolys[i]+1).Append("/").Append(tPolys[i]+1).Append(" ").
                       Append(tPolys[i+1]+1).Append("/").Append(tPolys[i+1]+1).Append(" ").
                       Append(tPolys[i+2]+1).Append("/").Append(tPolys[i+2]+1).Append(" ").
                       Append(tPolys[i+3]+1).Append("/").Append(tPolys[i+3]+1);
                    sw.WriteLine(sb);
                }      
            }
        }
        catch (err) {
            Debug.Log("Error saving file: " + err.Message);
        }
        sw.Close();
        
        terrain = null;
        EditorUtility.ClearProgressBar();
        EditorWindow.GetWindow(ExportTerrain).Close();
    }
    
    function UpdateProgress () {
        if (counter++ == 1000) {
            counter = 0;
            EditorUtility.DisplayProgressBar("Saving...", "", Mathf.InverseLerp(0, totalCount, ++tCount));
        }
    }
}

将3D建模软件建立的地形导入Unity3D中作为地形.

将下面的脚本放在项目文件的资源目录的Editor文件夹下.
Terrain菜单下出现Object to Terrain时,在场景视图或者层次面板选择一个对象,这个对象将转变外高度图用于地形.这个对象必须包含网格.如图:

这个函数用的是和网格轴相同的包围盒,如果对象在x轴和z轴有旋转.或者y轴有90度以上旋转时.可能会有奇怪的结果.
你可能要调整地形的高度匹配你的网格对象(可以使用Terrain菜单下的Set Resolution…).

下面为Object2Terrain.js脚本内容

@MenuItem ("Terrain/Object to Terrain")

static function Object2Terrain () {
    // See if a valid object is selected
    var obj = Selection.activeObject as GameObject;
    if (obj == null) {
        EditorUtility.DisplayDialog("No object selected", "Please select an object.", "Cancel");
        return;
    }
    if (obj.GetComponent(MeshFilter) == null) {
        EditorUtility.DisplayDialog("No mesh selected", "Please select an object with a mesh.", "Cancel");
        return;
    }
    else if ((obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh == null) {
        EditorUtility.DisplayDialog("No mesh selected", "Please select an object with a valid mesh.", "Cancel");
        return;  
    }
    if (Terrain.activeTerrain == null) {
        EditorUtility.DisplayDialog("No terrain found", "Please make sure a terrain exists.", "Cancel");
        return;
    }  
    var terrain = Terrain.activeTerrain.terrainData;
    
    // If there's no mesh collider, add one (and then remove it later when done)
    var addedCollider = false;
    var addedMesh = false;
    var objCollider = obj.collider as MeshCollider;
    if (objCollider == null) {
        objCollider = obj.AddComponent(MeshCollider);
        addedCollider = true;
    }
    else if (objCollider.sharedMesh == null) {
        objCollider.sharedMesh = (obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh;
        addedMesh = true;
    }
    
    Undo.RegisterUndo (terrain, "Object to Terrain");

    var resolutionX = terrain.heightmapWidth;
    var resolutionZ = terrain.heightmapHeight;
    var heights = terrain.GetHeights(0, 0, resolutionX, resolutionZ);
    
    // Use bounds a bit smaller than the actual object; otherwise raycasting tends to miss at the edges
    var objectBounds = objCollider.bounds;
    var leftEdge = objectBounds.center.x - objectBounds.extents.x + .01;
    var bottomEdge = objectBounds.center.z - objectBounds.extents.z + .01;
    var stepX = (objectBounds.size.x - .019) / resolutionX;
    var stepZ = (objectBounds.size.z - .019) / resolutionZ;
    
    // Set up raycast vars
    var y = objectBounds.center.y + objectBounds.extents.y + .01;
    var hit : RaycastHit;
    var ray = new Ray(Vector3.zero, -Vector3.up);
    var rayDistance = objectBounds.size.y + .02;
    var heightFactor = 1.0 / rayDistance;
        
    // Do raycasting samples over the object to see what terrain heights should be
    var z = bottomEdge;
    for (zCount = 0; zCount < resolutionZ; zCount++) {
        var x = leftEdge;
        for (xCount = 0; xCount < resolutionX; xCount++) {
            ray.origin = Vector3(x, y, z);
            if (objCollider.Raycast(ray, hit, rayDistance)) {
                heights[zCount, xCount] = 1.0 - (y - hit.point.y)*heightFactor;
            }
            else {
                heights[zCount, xCount] = 0.0;
            }
            x += stepX;
        }
        z += stepZ;
    }
    
    terrain.SetHeights(0, 0, heights);
    
    if (addedMesh) {
        objCollider.sharedMesh = null;
    }
    if (addedCollider) {
        DestroyImmediate(objCollider);
    }
}

Cube3D_小游戏系列之花式弹球

独立开发的小游戏系列之一花式弹球,四种游戏模式,25个关卡.

你需要射击一个银色球,将画面中的橙色球全部击中消除便可过关,除此之外,还有紫色的高分球,绿色的能力球.你必须通过挑战模式才能进入冒险模式.连续挑战八个随机出现的关卡,全部通过后会有银杯奖励.连续挑战八个会有障碍出现的关卡,全部通过后会有金杯奖励.

菜单为罗马尼亚语,以下对译仅供参考:

快速模式 Joc
挑战模式 Turneu
冒险模式 modul de aventura
生命值无限模式 Placerea nelimitata
阶段 etape

在线地址:http://www.to3d.com/3donline/showfull-932-1.html

别说程序员没见过钱,提醒发包的人注意

看到这个,挺感触的.刚经历客户要求iPhone上的跑的一个角色达到她的参考图.她那个是25w个三角形,我这边用1.5k三角形重建,说不圆润.后来我让她那边那个用Poser做25w个三角形角色的做了.我给了很大宽限,3k三角形!做吧.别以为没技术含量.谁都能做!
少发牢骚,多干活.

2010,04,01更新:
客户給来反馈,那边做不了.我哥们很有兴致的让我要客户那边的成品,要来后.我差点喷了,把原来25w三角形的东西放在了Max里,用了一个现成的减面修改器.也没减到预想面数,还问我贴图用什么画啊.我问这个做了多久.说熬了一夜.我差点喷了,打开Max,加修改器.5分钟搞定….最后还是要用我这边1.5k三角形的模型.其实也瞒感谢这次换模型的机会,让我找到了Unity中动画穿帮的具体原因.哦耶.

arachide
2010-03-12 12:06
市场要有基准价
这坛子上很多月入几千美元的人很多
发包前自己先估算一下
工时:
1。高手(做过10个app,累计开发时间2000小时以上)要多少小时,一般开发人员(做过2个app,累计开发时间400小时以上)要多少时间
[盖磁先生说过20000小时他成的高手,cocoa不简单,iphone开发不难,2000小时开发时间足以成为高手]
2。项目完成大致要多少工时
小时工资:
高手我定价20美元/小时
一般人员10美元/小时
这个价格已经低于那些英文外包网站了
一般的app从开发到测试后期维护没有200小时是做不出好东西的
所以发包让别人做个app,先准备好12000rmb(最低了,宫宝鸡丁盖浇饭北京8块买到我保证你吃的是地沟油)
别动不动写什么简单,就多少多少行,我没时间做,浪费大家时间
这年代谁傻啊
superarts
2010-03-12 13:09
基本同意。有一天有人给我开外包价1000,乐死我了。直接加黑名单。
ooxxyy
2010-03-12 13:36
10K一下基本不接
pipapipa
2010-03-12 13:41
真是这个行情????
gagaga
2010-03-12 13:47
嗯,iPhone外包的话,个人接活,最低2000-4000美元左右这个数字我都觉得少了。复杂一点的要多得多。
另外个人认为,尤其是那种用到http接口的App,还需要考虑进沟通成本。
一两千人民币预算的还是免开尊口吧。
另外,鉴于乙方通常都是弱势 ,尤其个人接单,因此这个参考价格我放到分区公告里了。
我非常同意的一点就是,如果发包者认为某个事情“简单”,通常您需要谨慎了,因为收不到钱或者收到很少钱的可能性很大。
举例说明:即便是一个里面只要求嵌入一个固定网址,打开就显示网页的这种程序,可能是最最简单的iPhone程序,都要有如下工作要做:
1 开发环境,因为你需要苹果电脑,装上Leopard或者雪豹,并下载2G多的SDK。这要求你会Mac OS的基本操作。
2 调试环境:你需要至少有一个iPod Touch。
3 你至少需要了解UIWebview的作用,否则你都不知道嵌入网页要用UIWebview还是用别的什么。
4 如果要用Interface Builder,你需要了解什么是IBOutlet,如果用代码创建,你需要了解View的层级,你需要了解如何使用AddSubview,你需要知道ViewController是干嘛用的。
5 你需要会查文档,你需要知道Delegate是干嘛的。
6 你需要了解NSURLRequest,以及NSString的基本功能和用法。
7 你需要会用Reachability,需要知道如何修改Info.plist来检测网络是否联通。你要知道怎么弹出AlertView。
8 你需要了解Default.png是干嘛用的,你需要了解小图标的尺寸,你需要了解大图标的尺寸,你需要了解如何修改Info.plist不显示高光。
9 如果让你帮着提交,你还要会用iTunes Connect。
简单吗?简单。不简单吗?不简单。
如果是这样一个只嵌入死一个网页的程序,如果让我来做外包,最少我也要给人家报1-2万,觉得简单你自己做,想省多少钱都行。
pipapipa
2010-03-12 14:17
支持一下!~~~~~~~
jerrylee
2010-03-12 14:24
纯支持!那些动不动拿个2~3K人民币出来就想找人做个App的,就不要出来现眼了,你们觉得简单就自己做去,俺们丢不起那个人!
neogui
2010-03-12 14:24
没做过app的人飘过… 我大概只能去吃地沟油做的盖浇饭了… T_T
yoyokko
2010-03-12 14:55
引用
引用第7楼neogui于2010-03-12 14:24发表的  :
没做过app的人飘过… 我大概只能去吃地沟油做的盖浇饭了… T_T
做过Hello World.app的人飘过……ls的分俺一勺饭呗?
arachide
2010-03-12 15:07
多说几句
1。Jobs推出app store的本质就是解放程序员(国内俗称的内容提供商)的劳动生产率,价值最大化,减少中间环节。
2。CA的前老板华人王家廉说过
软件行业2样东西企业不要想省钱(省纸省电低碳我支持)
1。开发工具(软件硬件)
2。人员工资
华人企业很多看重成本,说我们有便宜的人才,但是做企业更看重的是创新价值,而不是把高科技创新智财行业办成血汗工厂,短期看这样企业降低了成本,长期看企业丧失了创新的活力
你不懂技术有销售渠道可以
你没大的销售渠道只靠技术吃饭也可以
你没渠道,没技术,但眼光好,舍得正确投入也可以
没技术,没渠道,没资金,总想着别人身上揩油,偷偷摸摸挣点阴暗钱
那是你的杯具,不是我们的

  

  

pipapipa
2010-03-12 15:13
继续支持…….!~~~~~~~
deadseafu
2010-03-12 15:24
真TM提气,不过gagaga老大直接给人家省了1-2万,真.好人也
gagaga
2010-03-12 15:37
引用
引用第11楼deadseafu于2010-03-12 15:24发表的  :
真TM提气,不过gagaga老大直接给人家省了1-2万,真.好人也


其实有些情况下,找外包的也不是故意不靠谱,有些可能也确实是不了解,我们要突出体现教育客户之后再服务客户的良好理念,与客户双赢。
hanyegudeng
2010-03-12 15:42
相当不错!!!!

  

  

ke888le
2010-03-12 16:25
公道的说一句,人为规定这种事没什么意思,必定我们程序员也是处在一个大的自由市场下。
随着做iPhone开发的人越来越多,尤其是兼职的朋友越来越多,我们的价格又靠什么保持坚挺呢?
botorman
2010-03-12 16:46
到目前从没接过外包的路过
neogui
2010-03-12 17:02
引用
引用第14楼ke888le于2010-03-12 00:25发表的  :
公道的说一句,人为规定这种事没什么意思,必定我们程序员也是处在一个大的自由市场下。
随着做iPhone开发的人越来越多,尤其是兼职的朋友越来越多,我们的价格又靠什么保持坚挺呢?
呵呵,想想5年前,国内才几个做苹果开发的呀。
magicsoft
2010-03-12 17:18
这贴一定要顶啊!
tsong0202
2010-03-12 17:47
虽然还没接过外包,但以后肯定有机会的。
这贴子先顶起来  =)
哎,现在程序员一般都是弱势群体,同志们应该团结起来。
nono
2010-03-12 17:57
同意gagaga大和LZ的
gagaga
2010-03-12 18:14
引用
引用第14楼ke888le于2010-03-12 16:25发表的  :
公道的说一句,人为规定这种事没什么意思,必定我们程序员也是处在一个大的自由市场下。
随着做iPhone开发的人越来越多,尤其是兼职的朋友越来越多,我们的价格又靠什么保持坚挺呢?
也不是规定吧,可能有不少朋友没什么经验的,至少能少走点弯路。
arachide
2010-03-12 18:20
引用
引用第20楼gagaga于2010-03-12 18:14发表的  :
也不是规定吧,可能有不少朋友没什么经验的,至少能少走点弯路。
没人规定什么
程序员是弱势?那是因为自己不强
我认识几个soho一年50Wrmb以上,逍遥着呢
objective c跟c,vc,delphi一样,任何时候都不会满大街成堆人能干的
英文外包站基准价是25美元(多是印度东欧人接,国人也不少)
大幅低于着价格贱卖自己那是接包人自己的错
skyzhong
2010-03-12 19:45
严重支持

pixar
2010-03-12 21:07
感觉还是gagaga大大说话有水平
glueklig
2010-03-12 21:37
这个要顶的

limengjsm
2010-03-12 21:41
知道自己得价格了

neogui
2010-03-13 01:02
价格是靠自己的能力挣的,什么水平什么价格。
rovercat
2010-03-13 01:09

话说我差点接了2k多的外包 突然有事做不了。。。
支持lz 支持gagaga
ekin0311
2010-03-13 01:55
我也觉得几k的单子没必要接,但是大家还应该考虑一个地域的问题,比如我在成都,成都的人力成本本来就比上海北京低。就好像国内的价格比国外低一样。
cnlaoke
2010-03-13 02:47
我觉得国内的iPhone开发者要保持一致,统一思想,国人的盲从性,有钱就赚的人多的是,就像现在的web开发,稍微了解点的人买个空间,下个网上源码就能搞个网站出来,小城市200块钱-500块钱做站的人多的是…同样都是程序员,至于么…市场就是被这样的人搞坏的,最后弄的大家都没饭吃…
还好iPhone开发在硬件上给开发者设立了一个门槛,一台macbook+iPhone 没个万把块钱下不来,即使买个touch 一起也要不少钱…嘿嘿,所以希望这种门槛能一致保持下去,不然程序员每天累的半死,赚的钱却少的可怜…

逍遥一狂
2010-03-13 11:05
前几天也帮某人省了不少
出的那价格还不如我自己做自己上线,一天卖上个位数半年也拿这么多了。说不定哪天人品爆发。。。
arachide
2010-03-13 12:09
引用
引用第30楼逍遥一狂于2010-03-13 11:05发表的  :
前几天也帮某人省了不少
出的那价格还不如我自己做自己上线,一天卖上个位数半年也拿这么多了。说不定哪天人品爆发。。。
说的就是这个意思
一个app平均年收入5000~7000刀(2小时做出的不算啊),低于这个说明你做的有问题(定位,品质)
不能说发包的人自己去挣这5000~7000刀,然后给别人1000刀
这些人很可笑
你发包要有自信你的revenue要10000刀,这个做不到,那你还是自己玩吧
bibivsvivi
2010-03-13 15:08
顶 , 一下。
qdvictory
2010-03-13 15:16

  

不能贱卖自己,也不能贱卖技术,继续努力灌水
jinhaogxy
2010-03-14 14:43
一定支持开发人员, 我们不能变成了廉价劳动力
wode211
2010-03-15 10:25
这个贴子很火啊
虽然我至今也没接过外包。

  

jzgenius
2010-03-15 11:23
来晚了,来晚了,这帖子一定也要说说。
国内外包的行情,有高有低。那个8块宫保鸡丁的比喻实在恰当。
但,就是有人可以用1k找到人开发个APP,就是有人可以用很少的代价找到别人为其“服务”,就是有人可以拿到可怜的1k。。。
还有个情况,目前大家一谈到外包,多半的考虑都是不靠谱,东西功能可以性能不行,那么就是bugs连天,要么就是时间N久。总之是不靠谱,没质量等等。
所以,好些人不敢找外包。但自己作不过来,又必须找外包。
上面2个情况,有人收到1k,有人必须找外包还抱怨。其实,有着必然的因果关系。
所谓便宜没好货,好货不便宜,这个道理实在太对了。
大家很多人都不是故意的以次充好,高估了自己的技术实力的同时,又需要MONEY,所以也会接受低廉的佣金。
这是造成上面情况的必然过程。
简单总结说,市场行情已经搞乱了,被我们自己搞乱了。毕竟,大家不是一个人,大家有个人的情况。行情也有每个人自己的标准。因此1k(很便宜的意思,数字不准确)找人就成为了必然。而必然也有新手乐于接受1k的佣金。那么,叫价10k+的,还有可能拿到外包么?自然没有。而10k的不做外包,都是1k的作,结果与10k的大部分都是有着差据的,自然,发包者也会有着这样那样的不满意。一次次这样的事件,一次次这样的结果,一次次的压低价格,一次次的,行情就乱了。
前面有兄弟说,大家一定要统一起来,坚挺价格,坚挺质量。哥们儿我双手双脚都拍红了来支持你!
但是,我们不是别人,我们来坚持了,别人呢?坚持的人会否笑到最后呢?这里就要加上一个个人的运气部分了。
无论如何,我一定会坚挺价格,如同曾经我出售棋牌游戏系统,现在不做了一样。满大街都是4、5k的棋牌游戏系统,已经不值钱了,我即便缺钱,我也不会再售,让他们去折腾吧。这不,我已经开始瞄准了APP市场来学习,打不过,咱也不生气,我换阵地。。。
其实挺无奈的,但无奈也有无奈的活法。APP是先进的理念,让程序员与用户更近了一步。我不管APPLE拿到了我多少剩余价值,我只知道他提供了一个通路,让有能力的、能坚持的人有机会施展自己,这就够了。
最后,呼吁大家,从自己做起,不要让自己成为破坏市场行情的那个人就好~
jzgenius
2010-03-15 11:24
引用
引用第34楼jinhaogxy于2010-03-14 14:43发表的  :
一定支持开发人员, 我们不能变成了廉价劳动力
想当年,98、99、2000年左右,接外包,还是挺爽的。
现在,坚决不接了。原因就是,感觉自己过于廉价,很不爽。
而,把自己的时间出售给那些人,还不如去学习,陪老婆呢,对不~
superarts
2010-03-15 15:22
98年就接外包了,还是“很新的手”

  

膜拜
bluebird
2010-03-16 15:26
开发人员上的多。
所以我们在谈这么高的价钱。
10个App就算高手。除非每个App都是复杂而且各不相同的。
另外,支持高工资,我觉得还是太多差劲的代码工人把市场搞乱了,
做程序本来就应该是一项创意+智慧+毅力的事情,而现在门槛却这么低
所以程序员工资每况愈下,
现在值钱的应该是UI设计师和架构师了。真写代码的………唉
long4success
2010-03-16 15:31
从没接过外包的人飘过。。。

madjuliet
2010-03-16 15:32
怎么没人找我做外包呀。。。
piepie
2010-03-16 15:56

  

  

  顶一下 有道理
alexliu
2010-03-16 16:14
大家一起维护市场秩序,一起营造市场环境,一起加油,一起不要破坏市场规律。
一起遵守潜规则。。我汗·~~
gagaga
2010-03-17 18:30
引用
引用第43楼alexliu于2010-03-16 16:14发表的  :
大家一起维护市场秩序,一起营造市场环境,一起加油,一起不要破坏市场规律。
一起遵守潜规则。。我汗·~~
其实我觉得这个蛮好的。主要是最近确实有不少人,两三千块钱找人开发项目,而且美其名曰“简单”。
到也不一定是“潜规则”,但是确实有不少开发者缺乏接项目的经验,有这么个提醒的贴子,我个人认为不是坏事。
allesgut
2010-03-17 22:39
最讨厌的就是发贴的自称简单的小项目。
接触过一个还是一个公司的简单的小项目,又要跟服务器交互,上传,下载,认证登陆,
下来之后二十几个view,可笑的连需求都没又,就拿纸和笔像小朋友在纸上涂鸦一样在纸上画了几个图。 回来之后直接黑名单。
heighgun
2010-03-17 23:09
从现在的情况看,app的外包项目还是需要写程序的有较高的综合素质的,不会 出现所谓代码工人的情况
appcute
2010-03-17 23:21
引用
引用第41楼madjuliet于2010-03-16 15:32发表的  :
怎么没人找我做外包呀。。。
这位MM,做外包很辛苦的呢。很多人一听外包都翘胡子。你准备好了吗?哈哈。
说说我的看法:
外包=有限的回报 + 固定付出+无限的付出 * x  
公式中的 x 是你的发包方,包括人品,信誉,财力等综合评分,1是最差,0最好。个人经验x值在0~0.2你赚,大于这个就要考虑了。
Btw. 以上是我做了9年的外包总结。

原帖:http://www.cocoachina.com/bbs/simple/index.php?t16264_1.html