
@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脚本如下
我看不懂,但是这确实是一个毫无错误的技术美术代码
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代码:
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 删除。