首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >超级智能体---codebuddy的Craft

超级智能体---codebuddy的Craft

原创
作者头像
张曙光
修改2025-05-29 13:51:33
修改2025-05-29 13:51:33
2670
举报

@CodeBuddy

此次分享的内容依然和腾讯云的codebuddy有关,关于基础操作(包括codebuddy的简介安装,启用,禁用Copilot)等内容 ,辛苦移步之前的文章与视频: 1.游戏开发者使用code buddy能做成什么样? C# Unity 2.Unity技术栈遇上CodeBuddy,全民独立游戏制作人有望了?

此次分享的是专门针对codebuddy的智能体Craft写个使用感受.我将由浅入深的对Craft提出需求看看Craft的表现如何. 并且依然是Unity+VSCode

因为我的技术栈是有关unity开发的.目前也是在一个非著名的小厂工作.所以对于unity技术栈需要的技术有些高.某些原型验证关于场景的搭建,一般都是由自己完成.当然有时间我自己也在研究有关技术美术的东西.要是按照之前的习惯,对于一些特殊的效果,我当然是去搜索,如果网上找不到,那么我也就束手无策. 在AI普及的今天,也许我会有新的救赎

简单的功能

注意,在unity技术栈中使用codebuddy一定是要先有unity项目(或者说工程),并且项目中有一个空的脚本,比如GameController.cs,或者是GameManager.cs文件.即使你一行代码不写,也要新建在那,然后用VSCode打开脚本,这么做为的是让Craft知道它的工作区域是哪里.不然的话,对于需求Craft是不会回应的.

简单的功能是我让它提供一个代码块.比如我想做一个物体的射线检测的功能.那么什么是射线检测呢?在游戏开发中这个功能还是比较常见的.就是回向某个方向发射一条射线出去,这条射线长度有限,也可以无限,那么射线落在哪个物体上,就会返回这个物体的信息.比如FPS游戏中激光炮.因为没有实体的子弹.所以用射线检测是最合适的.那么来看此需求给到Craft,会有怎么样的回复.

首先它读取了我当前的项目结构,并且扫描到我的"RaycastTest.cs"脚本,也许是我的命名不规范,或者是带有test的字眼.它并没有直接在这个应该放射线检测功能的脚本中实现.反而是自己新建了一个射线检测的工具类:"Ray cast Detection.cs" ,并且给了我一个鼠标自由视角,点击鼠标左键发射射线的功能,最后它给了我一个开火射击的脚本,一共是3个脚本,代码量450行.

首先我的提问只是简单的射线检测,原本的期待就是简单的一个测试脚本,给个Test.cs一类的就可以了.

但是到最后,不仅把射线检测封装成工具类,并且给了我一个FPS的Demo.这是我没有想到的.

并且这3个脚本没有任何错误.

运行起来也是没有问题. 今天体验Craft我的感觉是"过于热情",也许是因为这个功能太简单了????????

如果给个复杂的功能会怎么样呢?

复杂的功能

其实在大部分开发者的眼中,技术美术无疑是大佬般的存在.就看市面上的编程书,到处都是,什么Python,Unity ,H5这一类的.但是关于技术美术的书籍.一只手数的过来.为什么了呢?就是因为入门的门槛太高了.首先会语法,(当然语法还只是最简单的)其次自己有美术的底子(废话,没有美术底子怎么做技术美术!),但是最难的,就是3d数学了(数学就数学,还分什么2d,3d) ,现在印象最深刻的就是当时买了一本<3d数学基础> ,耐着性子学到了矩阵.我就彻底歇菜了.那么今天,我就给Craft说个技术美术的需求,看它,能不能做出来.如果能.我愿称之为最强,如果不能,也没啥.毕竟国内的技术美术都在大厂.而且他们估计也不会把自己的项目放网上给AI训练.这块知识AI缺少我也能理解.

那么复杂的功能是什么样的呢?那么就让它做个3s材质.忘了说了,材质是技术美术的体现.就是模型所展示的"质感"

以下就是不同的材质(技术美术实现)所产生的质感.

有的像玻璃.有的像玉石.有的像塑料.

所以我对Craft让它做一个3S材质球.看看能不能做出来

那么第一次给出的结果不出意外的有问题,首先它给的shader脚本报错,所以材质体现是不对的.不过,新建文件夹并把文件放在新建的文件夹里面倒是执行的很成功

错误:

材质表现:

所以我将再次尝试让它修改

因为我对于技术美术懂得少之又少,所以对于错误,我也无法修改,所以只能让它自己修改,看能不能修改过来.

再次提问:

Craft也许是卡住了,大概过去了2-3分钟,它一直是在思考

也许我的提问有问题,我们开发人员当然知道材质球依赖与shader脚本,但是第一次提问,它只做了一个材质球,所以也许我应该让它写一个shader脚本,然后我手动的赋值在材质球上.

等待2-3分钟是提示网络断开连接了.这个问题比较常见..........

重新提问:

果然,这次没有报错,shader脚本如下

我看不懂,但是这确实是一个毫无错误的技术美术代码

代码语言:csharp
复制
Shader "Custom/3DMaterial"
{
    Properties
    {
        _Color ("颜色", Color) = (1,1,1,1)
        _MainTex ("主纹理", 2D) = "white" {}
        _Glossiness ("光滑度", Range(0,1)) = 0.5
        _Metallic ("金属度", Range(0,1)) = 0.0
        _BumpMap ("法线贴图", 2D) = "bump" {}
        _BumpScale ("法线强度", Float) = 1.0
        _EmissionMap ("自发光贴图", 2D) = "black" {}
        [HDR]_EmissionColor ("自发光颜色", Color) = (0,0,0,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _BumpMap;
        sampler2D _EmissionMap;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float2 uv_EmissionMap;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        float _BumpScale;
        half4 _EmissionColor;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // 主纹理和颜色
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            
            // 法线贴图
            o.Normal = UnpackScaleNormal(tex2D(_BumpMap, IN.uv_BumpMap), _BumpScale);
            
            // 金属度和光滑度
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            
            // 自发光
            half4 emission = tex2D(_EmissionMap, IN.uv_EmissionMap) * _EmissionColor;
            o.Emission = emission.rgb;
            
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

但是赋值之后,依然没有任何效果.所以我再次让它修改

继续提问让它修改:

它理解了我的问题,但是给出的结果还是错误的,把材质调成透明的了,但是还是不透光..

正面
正面
反面
反面

下面我不再记录每一步的操作,再尝试几次,如果还是没有效果,那么我也只好放弃.

最后的结果:

因为最后我直白的说出这是哪种效果,这一次,倒是成功了

最后的表现::

光是在蜡烛后面的.这种就是3S材质.

Craft生成的shader代码:

代码语言:csharp
复制
Shader "Custom/3DMaterial"
{
    Properties
    {
        _Color ("颜色", Color) = (1,1,1,1)
        _MainTex ("主纹理", 2D) = "white" {}
        _Glossiness ("光滑度", Range(0,1)) = 0.5
        _Metallic ("金属度", Range(0,1)) = 0.0
        _BumpMap ("法线贴图", 2D) = "bump" {}
        _BumpScale ("法线强度", Float) = 1.0
        _EmissionMap ("自发光贴图", 2D) = "black" {}
        [HDR]_EmissionColor ("自发光颜色", Color) = (0,0,0,1)
        
        // 次表面散射参数
        [HDR]_SubsurfaceColor ("次表面散射颜色", Color) = (1,0.5,0.3,1)
        _SubsurfacePower ("次表面散射强度", Range(0.1,16)) = 8.0
        _SubsurfaceScale ("次表面散射范围", Range(0.1,10)) = 2.0
        _SubsurfaceDistortion ("次表面散射扭曲", Range(0,1)) = 0.5
        _ThicknessMap ("厚度贴图", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        // 自定义光照模型
        #pragma surface surf Translucent fullforwardshadows
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _BumpMap;
        sampler2D _EmissionMap;
        sampler2D _ThicknessMap;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float2 uv_EmissionMap;
            float2 uv_ThicknessMap;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        float _BumpScale;
        half4 _EmissionColor;
        
        // 次表面散射参数
        half4 _SubsurfaceColor;
        half _SubsurfacePower;
        half _SubsurfaceScale;
        half _SubsurfaceDistortion;

        // 自定义光照模型,支持次表面散射
        half4 LightingTranslucent(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
        {
            // 标准漫反射
            half NdotL = dot(s.Normal, lightDir);
            half diff = max(0, NdotL);
            
            // 次表面散射计算
            half3 h = normalize(lightDir + s.Normal * _SubsurfaceDistortion);
            float VdotH = pow(saturate(dot(viewDir, -h)), _SubsurfacePower) * _SubsurfaceScale;
            half3 subsurface = _SubsurfaceColor.rgb * VdotH * s.Alpha;
            
            // 最终颜色 = 漫反射 + 次表面散射
            half4 c;
            c.rgb = (s.Albedo * diff + subsurface) * _LightColor0.rgb * atten;
            c.a = s.Alpha;
            return c;
        }

        void surf (Input IN, inout SurfaceOutput o)
        {
            // 主纹理和颜色
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            
            // 法线贴图
            o.Normal = UnpackScaleNormal(tex2D(_BumpMap, IN.uv_BumpMap), _BumpScale);
            
            // 光滑度
            o.Specular = _Glossiness;
            o.Gloss = _Metallic;
            
            // 自发光
            half4 emission = tex2D(_EmissionMap, IN.uv_EmissionMap) * _EmissionColor;
            o.Emission = emission.rgb;
            
            // 厚度贴图用于次表面散射
            o.Alpha = tex2D(_ThicknessMap, IN.uv_ThicknessMap).r;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

总的来说,Craft是一个非常棒的智能体,只要提出需求,都能得到结果,不过目前的瑕疵就是会和服务器失去联系.目前反正是免费的,体验下来,收获颇多.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单的功能
  • 复杂的功能
  • 最后的结果:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档