unity c#中为什么不能直接更改transform.position.x的值?

The reason you can't directly alter the position vector is because it's actually a copy, not the actual position stored on the transform.

transform.position <--- returns a copy of the position
transform.position.x <--- the "x" value of the copy
transform.position.x = 7.0f <--- sets the "x" value on the copy

C# throws an error because you're setting the "x" value on a copy, which is then destroyed. It's a pointless line that if the compiler didn't pick up on it, could cause a tonne of hair pulling.

UnityScript gets around this when it compiles by converting your code and firing the C# setter:
transform.position.x = 7.0f
when compiled in UnityScript, translates (more or less) to:
var tempVector : Vector3 = transform.position;
tempVector.x = 7.0f;
transform.position = tempVector;

You can infer that because if you replicate this with a custom C# class, you can track as the getters/setters are invoked.

权威资料是这样解释的。这个如何解释,transform.position(position是Vector3类型的),transform是类。vector3是结构体的,vector3创建的可以直接修改x值,为什么这个position.x就不可以,实在不明白了?

2个回答

找到方法了,不是开放那边的定的

可以的话看全文后回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
unity3d c#调用脚本报错

using UnityEngine; using System.Collections; public class Destorybycontact : MonoBehaviour { public GameObject explosion; public GameObject playerexplosion; public int score1; private Gamecontrol game; void start() { GameObject gamecontrolobject = GameObject.FindWithTag("GameController"); if (gamecontrolobject != null) { game = gamecontrolobject.GetComponent<Gamecontrol>(); } if(gamecontrolobject == null) { Debug.Log("can't find 'Gamecontrol' scipt"); } } void OnTriggerEnter(Collider other) { if (other.tag == "boundary") { return; } Instantiate(explosion, transform.position, transform.rotation); if (other.tag == "Player") { Instantiate(playerexplosion, other.transform.position, other.transform.rotation); } game.addScore(score1); Destroy(other.gameObject); Destroy(gameObject); } } 报错NullReferenceException: Object reference not set to an instance of an object。显示这个是空值game.addScore(score1);。也不知道为什恶魔,求解

在Unity+Vuforia中为什么不能使用Destory销毁?

Vuforia中的DefaultTrackableEventHandler是当识别时,出现所有的组件;未识别到后,所有组件都被销毁 参考了这篇文章:https://blog.csdn.net/weixin_34275734/article/details/90558671 也就是《AR与VR开发实战》的3.1节 参照书里面的内容,我预先建了一个命名为TrackObject的C#文件,但是在以下这个程序中TrackObject总是报错。 //识别成功时候调用的方法 private void OnTrackingFound() { //动态加载模型并实例化到场景中 GameObject jiayou = GameObject.Instantiate(Resources.Load("Cube")) as GameObject; //生成之后设定它的父级为识别图物体 jiayou.transform.parent = this.transform; //设定物体的位置与识别图位置在同一位置,这里可以根据需求设定 jiayou.transform.position = this.transform.position; Debug.Log("出现啦"); } //识别丢失时候调用的方法 private void OnTrackingLost() { TrackObject to = GetComponentInChildren<TrackObject>(); if (to != null) { Destroy(to.gameObject); Resources.UnloadUnusedAssets(); } } TrackObject to = GetComponentInChildren<TrackObject>(); 中一直显示 TrackObject未定义 这是在另一个脚本调用其他脚本的问题吗? 是需要配置一下环境吗,还是要在最前面声明一下?

unity脚本中使用Instantiate创建GameObject的实例时,如何设置实例的脚本的参数

例如: Create是某个脚本类(即public class 某某某 : MonoBehaviour)中的方法,该方法要在必然事件Update中调用(这个前提不能改变)。 bulletType是GameObject的实例,该变量对应的prefab有脚本BulletForward 脚本BulletForward的脚本类有属性velocity。 ```c# private void Create(float velovity=0){ GameObject newBullet = Instantiate (bulletType, this.transform.position, this.transform.rotation) as GameObject; BulletForward bulletForward=newBullet.GetComponent<BulletForward>(); bulletForward.velocity = velovity; } ``` 上面的脚本在Update中调用方法了GetComponent。 听说方法GetComponent比较费时,不建议在Update()中调用。请问我听说的对吗?如果对,我应该如何重写方法Create,在设置GameObject的实例所挂载的脚本的参数velocity的同时避免上述缺陷?

unity 射线方向问题,射线总是射到0.0.0上

``` void Update () { RaycastHit hit; Vector3 fwd = transform.TransformDirection(Vector3.forward);//创建一个射线的方向 if (Physics.Raycast(transform.position, fwd, out hit, 10))//这里的“10”是射线的最大距离 { ////划出射线,在scene视图中能看到的射线 Debug.DrawLine(transform.position, hit.point, Color.yellow); } else { Debug.DrawLine(transform.position, hit.point, Color.red); } } ``` 我这样子写,所有的射线都朝着 0.0.0 射过去了, 第二个方向参数怎么改都没用, 然后我在2d 里面试了一下 所有的射线又都朝着 摄像机坐标射过去,, 所以这个射线方向到底应该怎么写。。。 还有一个问题,这么写, 即使我在射线中添加 box 有碰撞体,但是射线还是能传过去。。。。。

关于Unity3d中GameObject.Find方法的使用

有一个GameObject的对象是动态加载的 我要在一个c#是去Find这个动态加载的对象 该怎么弄啊 ,在游戏运行的时候场景中。会出现这个被动态加载进来的GameObject的名字 然后我在脚本是obj = GameObject.Find(“Login/Name”);这样 获得到的obj还是个null是怎么回事啊 obj = GameObject.Find(“Login/Name”);这天语句是在GameObject被动态加载进来之后执行的

关于Unity GL画图被UI遮挡的问题

![图片说明](https://img-ask.csdn.net/upload/201906/05/1559727242_54646.png) 下面是代码,目的是点击按钮之后再开始画线,可是画的线会被其他UI给中的挡住,我这里该如何修改?请各位看一下,麻烦了 ``` using UnityEngine; using UnityEngine.UI; public class TestLine : MonoBehaviour { public static Material lineMaterial; public Material tmpMaterial; Button tmp; bool isPaint = false; private void Awake() { tmp = GetComponent<Button>(); tmp.onClick.AddListener(TmpOnClick); } private void TmpOnClick() { isPaint = !isPaint; } static void CreateLineMaterial() { if (!lineMaterial) { // Unity has a built-in shader that is useful for drawing // simple colored things. Shader shader = Shader.Find("Hidden/Internal-Colored"); lineMaterial = new Material(shader); lineMaterial.hideFlags = HideFlags.HideAndDontSave; // Turn on alpha blending lineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); // Turn backface culling off lineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off); // Turn off depth writes lineMaterial.SetInt("_ZWrite", 10); } } public void OnRenderObject() { if (isPaint) { CreateLineMaterial(); //第几个pass渲染 lineMaterial.SetPass(0); //矩阵压栈 GL.PushMatrix(); //将顶点从local坐标系转换成世界坐标系 GL.MultMatrix(transform.localToWorldMatrix); //将透视投影改成正交投影 GL.LoadOrtho(); //开始画线 GL.Begin(GL.LINES); DrawLines(); //结束画线 GL.End(); //矩阵出栈 GL.PopMatrix(); } } public void DrawLines() { GL.Color(Color.red); GL.Vertex(Camera.main.ScreenToViewportPoint(transform.position)); GL.Vertex(Camera.main.ScreenToViewportPoint(transform.GetChild(0).position)); //GL.Vertex(Camera.main.ScreenToViewportPoint(transform.position)); Vector3 tmp= Camera.main.ScreenToViewportPoint(transform.position); Vector3 result = Camera.main.ScreenToViewportPoint(transform.GetChild(0).position); Vector3 tmp1 = new Vector3(tmp.x , tmp.y+0.01f, 0); Vector3 result1= new Vector3(result.x , result.y+0.01f, 0); GL.Vertex(tmp1); GL.Vertex(result1); //Vector3 tmp2= new Vector3(tmp.x -0.1f, tmp.y, 0); //Vector3 result2= new Vector3(result.x - 0.1f, result.y, 0); //GL.Vertex(tmp2); //GL.Vertex(result2); } } ```

c#中变量内存的释放问题

下面一段程序是unity脚本里的一个控制鱼随机移动的脚本,能够实现预想的效果,但是发现时间稍微一场,电脑就会很卡,应该是不断生成的位置和方向占用了大量内存,有什么方法可以解决吗? public class Move : MonoBehaviour { private Vector3 targetPos = new Vector3(0, 0, 60);//目标位置 private Quaternion targetRot = Quaternion.identity;//目标旋转角度 public float minx, miny, minz, maxx, maxy, maxz; void Start() { StartCoroutine(IEmove());//开启携程 } IEnumerator IEmove() { while (true) { while (Vector3.Distance(this.transform.position, targetPos) > 1f) {//鱼的位置与目标位置大于0.5f时,鱼继续向目标位置移动 Vector3 lastposition = this.transform.position; this.transform.position = Vector3.Lerp(this.transform.position, targetPos, 0.03f);//移到目标位置 this.transform.rotation = Quaternion.Slerp(this.transform.rotation, targetRot, 0.03f);//转到目标方向 yield return new WaitForSeconds(0.02f); } instargetPos();//生成下一个目标位置 instargetRot();//生成下一个目标方向 yield return 0; } } Vector3 instargetPos() {//随机生成目标位置的方法 targetPos = new Vector3(Random.Range(minx, maxx), Random.Range(miny, maxy), Random.Range(minz, maxz)); return targetPos;//返回目标位置 } Quaternion instargetRot() {//随机生成目标方向的方法 targetRot = Quaternion.Euler(new Vector3(Random.Range(-180, 180), 0, 0)); return targetRot;//返回目标方向 } }

做了一个水果忍者的游戏,但是射线physics.raycast返回值总是为假

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Mouse : MonoBehaviour { public GameObject ballHalf; public GameObject cubeHalf; public GameObject coneTopHalf; public GameObject coneHalf; GameObject Obj = null; // Start is called before the first frame update void Start() { } Ray GenerateMouseRay(Vector3 touchPos) { Vector3 mousePosFar = new Vector3(touchPos.x, touchPos.y, Camera.main.farClipPlane); Vector3 mousePosNear = new Vector3(touchPos.x, touchPos.y, Camera.main.farClipPlane); Vector3 mousePosF = Camera.main.ScreenToViewportPoint(mousePosFar); Vector3 mousePosN = Camera.main.ScreenToViewportPoint(mousePosNear); Ray mr = new Ray(mousePosN, mousePosF - mousePosN); return mr; } // Update is called once per frame void Update() { if (((Input.touchCount>0 && Input.GetTouch(0).phase == TouchPhase.Moved) || Input.GetMouseButton(0))) { Plane objPlane = new Plane(Camera.main.transform.forward * -1, this.transform.position); Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition); float rayDistance; if(objPlane.Raycast(mRay,out rayDistance)) { this.transform.position = mRay.GetPoint(rayDistance); } Ray mouseRay = GenerateMouseRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(mouseRay.origin,mouseRay.direction,out hit)) { bool a = Physics.Raycast(mouseRay.origin, mouseRay.direction, out hit); Obj = hit.transform.gameObject; Debug.Log(hit.transform.tag); if (Obj.tag == "ball") { GameObject a1 = (GameObject)Instantiate(ballHalf, Obj.transform.localPosition, Obj.transform.localRotation); a1.transform.rotation *= Quaternion.Euler(0,0,90); a1.transform.Translate(3f, 0, 0); a1.GetComponent<Rigidbody>().velocity = Obj.GetComponent<Rigidbody>().velocity; GameObject a2 = (GameObject)Instantiate(ballHalf, Obj.transform.localPosition, Obj.transform.localRotation); a2.transform.rotation *= Quaternion.Euler(0, 0, -90); a2.GetComponent<Rigidbody>().velocity = Obj.GetComponent<Rigidbody>().velocity; Destroy(Obj); } } } } } ![图片说明](https://img-ask.csdn.net/upload/201910/21/1571646646_591142.png) 里面的刚体,碰撞器都有安装

unity中平台跳跃游戏,掉出平台重生后玩家速度无法为0的问题

想问下诸位,本人刚开始学unity,做一个玩家是球体的平台跳跃游戏,设定是玩家掉出平台后,下落时会碰到一个带触发器的平台,然后判定死亡,执行 ``` this.transform.position = respawnPoint.transform.position; ``` 传回出生点,但是回出生点后哪怕设置 ``` rb.velocity =new Vector3(0,0,0); ``` 玩家球体也依然会带有一定的速度,请问有什么办法让重生后速度什么的完全归0吗?如果能让球体强制静止个几秒更好。

Unity3d触屏旋转刚体模型,当手指拿开时会卡顿一下

想写一个触摸屏控制物体的惯性旋转 ``` if (Input.touchCount <= 0) { return; } if (1 == Input.touchCount) { Touch touch = Input.GetTouch(0); deltaPos = touch.deltaPosition; print(deltaPos); Vector3 Torque = new Vector3(deltaPos.y, -deltaPos.x, 0); transform.GetComponent<Rigidbody>().AddTorque(Torque); } ``` 现在问题就是,当手指拿开时,会有一瞬间的卡顿,请问如何解决?

Unity将图像上载到服务器,但Codeigniter不起作用

<div class="post-text" itemprop="text"> <p>I want to upload an image jpg to my server. I have try but it didn't work.</p> <p>I don't what cause the upload failed.</p> <p>Below the detail code.</p> <p><strong>Unity C#</strong></p> <pre><code>public void TakePicture(int maxSize) { if (NativeCamera.IsCameraBusy()) { Debug.Log("Camera Busy"); return; } else { NativeCamera.Permission permission = NativeCamera.TakePicture((path) =&gt; { Debug.Log("Image path: " + path); if (path != null) { // Create a Texture2D from the captured image Texture2D texture = NativeCamera.LoadImageAtPath(path, maxSize); //snap.SetPixels(tex.GetPixels()); byte[] bytes = File.ReadAllBytes(path); Debug.Log("Bytes:" + bytes); Destroy(texture); StartCoroutine(upload_ocr_image(bytes)); if (texture == null) { Debug.Log("Couldn't load texture from " + path); return; } // Assign texture to a temporary quad and destroy it after 5 seconds GameObject quad = GameObject.CreatePrimitive(PrimitiveType.Quad); quad.transform.position = Camera.main.transform.position + Camera.main.transform.forward * 2.5f; quad.transform.forward = Camera.main.transform.forward; quad.transform.localScale = new Vector3(1f, texture.height / (float)texture.width, 1f); Material material = quad.GetComponent&lt;Renderer&gt;().material; if (!material.shader.isSupported) // happens when Standard shader is not included in the build material.shader = Shader.Find("Legacy Shaders/Diffuse"); material.mainTexture = texture; Destroy(quad, 5f); // If a procedural texture is not destroyed manually, // it will only be freed after a scene change Destroy(texture, 5f); } }, maxSize); Debug.Log("Permission result: " + permission); } } IEnumerator upload_ocr_image(byte[] bytes) { // UtilityScript.GetComponent&lt;utility&gt;().Sand_Clock_Loading(true); // yield return new WaitForSeconds(2.5f); WWWForm formDate = new WWWForm(); formDate.AddField("frameCount", Time.frameCount.ToString()); formDate.AddBinaryData("ocr_image", bytes, "ocr.jpg", "image/jpg"); formDate.AddField("phone_code", "+61"); formDate.AddField("phone_number", "434599859"); using (UnityWebRequest www = UnityWebRequest.Post(web_url.url_upload_ocr_image, formDate)) { yield return www.Send(); //UtilityScript.GetComponent&lt;utility&gt;().Sand_Clock_Loading(false); if (www.isNetworkError) { Debug.Log(www.error); // UtilityScript.GetComponent&lt;utility&gt;().MessageBox_Check_Connection(); } else { Debug.Log(www.downloadHandler.text); } } } </code></pre> <p><strong>And this the code in server codeigniter php.</strong></p> <pre><code>function upload_ocr_image() { $phone_code = $this-&gt;input-&gt;post('phone_code', true); $phone_number = $this-&gt;input-&gt;post('phone_number', true); $allowedType = array(IMAGETYPE_GIF,IMAGETYPE_JPEG,IMAGETYPE_PNG); $imgType = exif_imagetype($_FILES['ocr_image']['tmp_name']); if(!in_array($imgType,$allowedType)) { echo "Images Type Error. Images Type Only : GIF , JPEG, PNG"; exit; } else { //upload original size front end slider $config['upload_path'] = './assets/ocr_image/'; $config['allowed_types'] = 'gif|jpg|png|jpeg'; $config['file_name'] = $phone_code.$phone_number; $config['overwrite'] = FALSE; $config['max_size'] = '8096'; $config['max_width'] = '6000'; $config['max_height'] = '6000'; $this-&gt;load-&gt;library('upload', $config); if(!$this-&gt;upload-&gt;do_upload("ocr_image")) { echo "Maximum File Size Only 2 Mb Or Max Width = 2000 , Height = 2000"; exit; } else { $img_data = $this-&gt;upload-&gt;data(); // Create Thumbnail /* $magicianObj = new imageLib("assets/ocr_image/".$img_data["file_name"].$phone_code.$phone_number); $magicianObj -&gt; resizeImage(80, 80, 0, true); $magicianObj -&gt; saveImage("assets/admin/img/photos/".$img_data["raw_name"]."_thumb".$img_data["file_ext"], 100); $next_id = $next_id.$img_data["file_ext"]; $thumb_name = $img_data["raw_name"]."_thumb".$img_data["file_ext"]; $data = array("photo_name"=&gt;$next_id, "thumb_photo_name"=&gt;$thumb_name, "create_date"=&gt;date("Y-m-d H:i:s")); $this-&gt;db-&gt;insert("gallery_tbl",$data); */ } } } </code></pre> <p><em>No error found. But it always failed.</em></p> <p><strong>This line of code in codeigniter PHP :</strong> </p> <blockquote> <p>if(!$this-&gt;upload-&gt;do_upload("ocr_image"))</p> </blockquote> <p>Always return <strong>true</strong>.</p> <p>How it work ?, How to upload the picture with proper way ?</p> <p><strong>Edited :</strong></p> <p>I use an asset native camera android and ios from unity to take a picture from camera.</p> <p>Thank You</p> </div>

关于AddComponent<T>()

我想用脚本创建多个预设物体,并在每个创建的物体上添加,而预设保持无脚本的状态改怎么写? 用这个语句为创建的物体添加了脚本之后,预设上也有了脚本,直接的后果是,多次创建之后,预设上多出了大量重复的脚本; 这是代码: using UnityEngine; using System.Collections; public class EnemyRush01 : MonoBehaviour { public GameObject Spawn; public GameObject Enemy; void Start () { Instantiate(Enemy,Spawn.transform.position,Quaternion.identity); Enemy.AddComponent<FlyMode01>(); } }

做了一个U3d的回合制游戏,但是为何只有一回合的战斗?

代码如下: 玩家的 public class PlayerFight : MonoBehaviour { public static PlayerFight _instance; //单例 public PlayerAnimState State = PlayerAnimState.Atk; //玩家默认状态 private Vector3 targetPos; //目标位置坐标 private Transform target; //目标 // public Text huiheshuText; //获取回合数 private float PlayerSpeed = 2.0f; public GameObject XuanXiang; //选择页面 private bool isDie = false; //是否死亡 public bool isBoutOver = false; //回合是否结束 private bool isShowControlPanel=false; //是否显示选择页面 private bool isAtk=false; //是否攻击过 private Vector3 StartPos; //玩家初始位置 private Vector3 StartRot; //玩家初始角度 private Transform PlayerPos; public Scrollbar actionBarPre; //行动条的预制体 public GameObject actionBar; public GameObject SkillEffect1; //技能1特效 public GameObject SkillEffect2; //技能2特效 public GameObject SkillEffect3; //技能3特效 public GameObject SkillEffect4; //技能4特效 // private EnemysFigth EnemySpeed; public float speed = 3f; //玩家速度 public float HP = 200; //玩家血量 public int atk = 20; //玩家普通攻击攻击力 //public float BarSpeed = 1; //进度条速度 private CharacterController controller; //游戏控制器 private Animation anima; //动画系统 public string animName_Idle; //站立 public string animName_Run; //奔跑 public string animName_Bruise; //受伤 public string animName_Atk; //普通攻击 public string animName_Skill1; //技能1攻击 public string animName_Skill2; //技能2攻击 public string animName_Skill3; //技能3攻击 public string animName_Skill4; //技能4攻击 public string animName_Die; //死亡 public float atkTimer; //攻击动画显示时间 public void Awake() { _instance = this; } // Use this for initialization void Start () { // EnemySpeed = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemysFigth>(); target = GameObject.FindGameObjectWithTag("Player").transform; //获取玩家坐标 XuanXiang.SetActive(false); //控制也面开始为显示状态 StartPos = transform.position; //储存玩家开始的位置,为以后做准备 StartRot = transform.localEulerAngles;//储存玩家开始角度 targetPos = StartPos; controller = transform.GetComponent<CharacterController>(); //获取玩家控制组件 anima = transform.GetChild(0).GetComponent<Animation>(); //获取玩家动画组件 } // Update is called once per frame void Update () { if(isDie) { } else { if (isShowControlPanel==false) { FightManager._instance.state = FightState.Player;//整个游戏的战斗状态为玩家控制 if (isShowControlPanel == false)//如果战斗菜单没有显示 { isShowControlPanel = true;//显示战斗菜单 XuanXiang.SetActive(true); } } if (FightManager._instance.state != FightState.Player)//当整个游戏战斗状态不是玩家控制,则要隐藏战斗菜单 { XuanXiang.SetActive(false); } else { //if (State) //{ //} //State = PlayerAnimState.Idle; State = PlayerAnimState.Atk; FightManager._instance.state = FightState.Player; if (isShowControlPanel==false) { isShowControlPanel = true; XuanXiang.SetActive(true); } } if (FightManager._instance.state != FightState.Player) { XuanXiang.SetActive(false); } switch (State) { case PlayerAnimState.Idle: PlayerAtk1(); break; case PlayerAnimState.Atk: { PlayerAtk(); break; } case PlayerAnimState.Skill1: PlayerSkill1(); break; case PlayerAnimState.Skill2: PlayerSkill2(); break; case PlayerAnimState.Skill3: PlayerSkill3(); break; case PlayerAnimState.Skill4: PlayerSkill4(); break; case PlayerAnimState.Die: break; default: break; } } } public void OnAttack() { State = PlayerAnimState.Atk; isAtk = false; } //对外接口——技能攻击 public void OnSkill() { switch (State) { case PlayerAnimState.Skill1: PlayerSkill1(); break; case PlayerAnimState.Skill2: PlayerSkill2(); break; case PlayerAnimState.Skill3: PlayerSkill3(); break; case PlayerAnimState.Skill4: PlayerSkill4(); break; case PlayerAnimState.Die: break; default: break; } isAtk = false; }

unity shader实现的水流效果在安卓上变成块状方片在流动,PC和IOS正常

在手机端的会随着时间的增长水流效果变的模糊 手机配置很低会立刻模糊 手机配置越高变模糊需要的时间越长 这是电脑的正常效果 ![图片说明](https://img-ask.csdn.net/upload/201903/26/1553580542_323567.jpg) 这是手机上不正常的效果 测试机是目前主流8核128G手机 ![图片说明](https://img-ask.csdn.net/upload/201903/26/1553580681_733001.jpg) 由于保密性我就只能截图一部分 下面是shader代码 ``` // Toony Colors Pro+Mobile 2 // (c) 2014-2017 Jean Moreno Shader "Toony Colors Pro 2/Examples/Water/Reflection" { Properties { [TCP2HelpBox(Warning,Make sure that the Camera renders the depth texture for this material to work properly. You can use the script __TCP2_CameraDepth__ for this.)] [TCP2HeaderHelp(BASE, Base Properties)] //TOONY COLORS _HColor ("Highlight Color", Color) = (0.6,0.6,0.6,1.0) _SColor ("Shadow Color", Color) = (0.3,0.3,0.3,1.0) //DIFFUSE _MainTex ("Main Texture (RGB)", 2D) = "white" {} [TCP2Separator] //TOONY COLORS RAMP _RampThreshold ("Ramp Threshold", Range(0,1)) = 0.5 _RampSmooth ("Ramp Smoothing", Range(0.001,1)) = 0.1 [TCP2Separator] [TCP2HeaderHelp(WATER)] _Color ("Water Color", Color) = (0.5,0.5,0.5,1.0) [Header(Foam)] _FoamSpread ("Foam Spread", Range(0.01,5)) = 2 _FoamStrength ("Foam Strength", Range(0.01,1)) = 0.8 _FoamColor ("Foam Color (RGB) Opacity (A)", Color) = (0.9,0.9,0.9,1.0) [NoScaleOffset] _FoamTex ("Foam (RGB)", 2D) = "white" {} _FoamSmooth ("Foam Smoothness", Range(0,0.5)) = 0.02 _FoamSpeed ("Foam Speed", Vector) = (2,2,2,2) [Header(Waves Normal Map)] [TCP2HelpBox(Info,There are two normal maps blended. The tiling offsets affect each map uniformly.)] _BumpMap ("Normal Map", 2D) = "bump" {} [PowerSlider(2.0)] _BumpScale ("Normal Scale", Range(0.01,2)) = 1.0 _BumpSpeed ("Normal Speed", Vector) = (0.2,0.2,0.3,0.3) _NormalDepthInfluence ("Depth/Reflection Influence", Range(0,1)) = 0.5 [TCP2Separator] [TCP2HeaderHelp(SPECULAR, Specular)] //SPECULAR _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1) _Shininess ("Roughness", Range(0.0,10)) = 0.1 [TCP2Separator] [TCP2HeaderHelp(REFLECTION, Reflection)] //REFLECTION _ReflStrength ("Reflection Strength", Range(0,1)) = 1 [HideInInspector] _ReflectionTex ("Planar Reflection RenderTexture", 2D) = "white" {} [TCP2Separator] [TCP2HeaderHelp(RIM, Rim)] //RIM LIGHT _RimColor ("Rim Color", Color) = (0.8,0.8,0.8,0.6) _RimMin ("Rim Min", Range(0,1)) = 0.5 _RimMax ("Rim Max", Range(0,1)) = 1.0 [TCP2Separator] //Avoid compile error if the properties are ending with a drawer [HideInInspector] __dummy__ ("unused", Float) = 0 } SubShader { Tags {"Queue"="Geometry" "RenderType"="Opaque"} CGPROGRAM #pragma surface surf ToonyColorsWater keepalpha vertex:vert nolightmap #pragma target 3.0 //================================================================ // VARIABLES fixed4 _Color; sampler2D _MainTex; float4 _MainTex_ST; sampler2D _BumpMap; float4 _BumpMap_ST; half _BumpScale; half4 _BumpSpeed; half _NormalDepthInfluence; sampler2D_float _CameraDepthTexture; half4 _FoamSpeed; half _FoamSpread; half _FoamStrength; sampler2D _FoamTex; fixed4 _FoamColor; half _FoamSmooth; fixed4 _RimColor; fixed _RimMin; fixed _RimMax; half _ReflStrength; sampler2D _ReflectionTex; struct Input { half2 texcoord; half2 bump_texcoord; half3 viewDir; float4 sPos; }; //================================================================ // CUSTOM LIGHTING //Lighting-related variables half4 _HColor; half4 _SColor; half _RampThreshold; half _RampSmooth; fixed _Shininess; //Custom SurfaceOutput struct SurfaceOutputWater { half atten; fixed3 Albedo; fixed3 Normal; fixed3 Emission; half Specular; fixed Gloss; fixed Alpha; }; inline half4 LightingToonyColorsWater (inout SurfaceOutputWater s, half3 viewDir, UnityGI gi) { half3 lightDir = gi.light.dir; #if defined(UNITY_PASS_FORWARDBASE) half3 lightColor = _LightColor0.rgb; half atten = s.atten; #else half3 lightColor = gi.light.color.rgb; half atten = 1; #endif s.Normal = normalize(s.Normal); fixed ndl = max(0, dot(s.Normal, lightDir)); #define NDL ndl #define RAMP_THRESHOLD _RampThreshold #define RAMP_SMOOTH _RampSmooth fixed3 ramp = smoothstep(RAMP_THRESHOLD - RAMP_SMOOTH*0.5, RAMP_THRESHOLD + RAMP_SMOOTH*0.5, NDL); #if !(POINT) && !(SPOT) ramp *= atten; #endif #if !defined(UNITY_PASS_FORWARDBASE) _SColor = fixed4(0,0,0,1); #endif _SColor = lerp(_HColor, _SColor, _SColor.a); //Shadows intensity through alpha ramp = lerp(_SColor.rgb, _HColor.rgb, ramp); fixed4 c; c.rgb = s.Albedo * lightColor.rgb * ramp; c.a = s.Alpha; //Specular half3 h = normalize(lightDir + viewDir); float ndh = max(0, dot (s.Normal, h)); float spec = pow(ndh, s.Specular*128.0) * s.Gloss * 2.0; spec *= atten; c.rgb += lightColor.rgb * _SpecColor.rgb * spec; #ifdef UNITY_LIGHT_FUNCTION_APPLY_INDIRECT c.rgb += s.Albedo * gi.indirect.diffuse; #endif return c; } void LightingToonyColorsWater_GI(inout SurfaceOutputWater s, UnityGIInput data, inout UnityGI gi) { gi = UnityGlobalIllumination(data, 1.0, s.Normal); gi.light.color = _LightColor0.rgb; //remove attenuation s.atten = data.atten; //transfer attenuation to lighting function } //================================================================ // VERTEX FUNCTION struct appdata_tcp2 { float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; float4 texcoord1 : TEXCOORD1; float4 texcoord2 : TEXCOORD2; float4 tangent : TANGENT; }; #define TIME (_Time.y) void vert(inout appdata_tcp2 v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); //Main texture UVs float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; half2 mainTexcoords = worldPos.xz * 0.1; o.texcoord.xy = TRANSFORM_TEX(mainTexcoords.xy, _MainTex); o.bump_texcoord = mainTexcoords.xy + TIME.xx * _BumpSpeed.xy * 0.1; float4 pos = UnityObjectToClipPos(v.vertex); o.sPos = ComputeScreenPos(pos); COMPUTE_EYEDEPTH(o.sPos.z); } //================================================================ // SURFACE FUNCTION void surf(Input IN, inout SurfaceOutputWater o) { half3 normal = UnpackScaleNormal(tex2D(_BumpMap, IN.bump_texcoord.xy * _BumpMap_ST.xx), _BumpScale).rgb; half3 normal2 = UnpackScaleNormal(tex2D(_BumpMap, IN.bump_texcoord.xy * _BumpMap_ST.yy + TIME.xx * _BumpSpeed.zw * 0.1), _BumpScale).rgb; normal = (normal+normal2)/2; o.Normal = normal; IN.sPos.xy += normal.rg * _NormalDepthInfluence; half ndv = dot(IN.viewDir, normal); fixed4 mainTex = tex2D(_MainTex, IN.texcoord.xy); float sceneZ = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(IN.sPos)); if(unity_OrthoParams.w > 0) { //orthographic camera #if defined(UNITY_REVERSED_Z) sceneZ = 1.0f - sceneZ; #endif sceneZ = (sceneZ * _ProjectionParams.z) + _ProjectionParams.y; } else //perspective camera sceneZ = LinearEyeDepth(sceneZ); float partZ = IN.sPos.z; float depthDiff = (sceneZ - partZ); //Depth-based foam half2 foamUV = IN.texcoord.xy; foamUV.xy += TIME.xx*_FoamSpeed.xy*0.05; fixed4 foam = tex2D(_FoamTex, foamUV); foamUV.xy += TIME.xx*_FoamSpeed.zw*0.05; fixed4 foam2 = tex2D(_FoamTex, foamUV); foam = (foam + foam2) / 2; float foamDepth = saturate(_FoamSpread * depthDiff); half foamTerm = (smoothstep(foam.r - _FoamSmooth, foam.r + _FoamSmooth, saturate(_FoamStrength - foamDepth)) * saturate(1 - foamDepth)) * _FoamColor.a; o.Albedo = lerp(mainTex.rgb * _Color.rgb, _FoamColor.rgb, foamTerm); o.Alpha = mainTex.a * _Color.a; o.Alpha = lerp(o.Alpha, _FoamColor.a, foamTerm); //Specular o.Gloss = 1; o.Specular = _Shininess; //Rim half3 rim = smoothstep(_RimMax, _RimMin, 1-Pow4(1-ndv)) * _RimColor.rgb * _RimColor.a; o.Emission += rim.rgb; fixed4 reflColor = tex2Dproj(_ReflectionTex, UNITY_PROJ_COORD(IN.sPos)); o.Emission += reflColor.rgb * _ReflStrength; } ENDCG } //Fallback "Diffuse" CustomEditor "TCP2_MaterialInspector_SG" } ```

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

springboot+jwt实现token登陆权限认证

一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程;对小项目而已是个轻量级的认证机制,符合开发需求;更多精彩原创内容关注公主号知识追寻者,读者的肯定,就是对作者的创作的最大支持; 二 jwt实现登陆认证流程 用户使用账号和面发出post请求 服务器接受到请求后使用私...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

早上躺尸,晚上干活:硅谷科技公司这么流行迟到?

硅谷科技公司上班时间OPEN早已不是什么新鲜事,早九晚五是常态,但有很多企业由于不打卡,员工们10点、11点才“姗姗来迟”的情况也屡见不鲜。 这种灵活的考勤制度为人羡慕,甚至近年来,国内某些互联网企业也纷纷效仿。不过,硅谷普遍弹性的上班制度是怎么由来的呢?这种“流行性迟到”真的有那么轻松、悠哉吗? 《动态规划专题班》 课程试听内容: 动态规划的解题要领 动态规划三大类 求最值/计数/可行性 常...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大胆预测下未来5年的Web开发

在2019年的ReactiveConf 上,《Elm in Action》的作者Richard Feldman对未来5年Web开发的发展做了预测,很有意思,分享给大家。如果你有机会从头...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

C 语言编程 — 堆栈与内存管理

目录 文章目录目录前文列表堆、栈内存管理动态分配内存重新调整内存的大小和释放内存 前文列表 《程序编译流程与 GCC 编译器》 《C 语言编程 — 基本语法》 《C 语言编程 — 基本数据类型》 《C 语言编程 — 变量与常量》 《C 语言编程 — 运算符》 《C 语言编程 — 逻辑控制语句》 《C 语言编程 — 函数》 《C 语言编程 — 高级数据类型 — 指针》 《C 语言编程 — 高级数据类...

计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年5月份最新版)

男怕选错语言,女怕嫁错情郎。

立即提问
相关内容推荐