unity3d 设置子父物体_unity3d如何实现子物体跟父物体同时移动时的子物体移动 - CSDN
  • public GameObject hj5;  public GameObject hj10;  private GameObject GetHand;  private GameObject szhj5;  private GameObject szhj10;  public void ShowSZHJ(bool sz5) ... 
        public GameObject  hj5;
        public GameObject  hj10;
        private GameObject GetHand;
        private GameObject szhj5;

        private GameObject szhj10;



       public  void  ShowSZHJ(bool sz5)
        {
            GetHand = GameObject.Find("ARCamera");
            if(sz5)
            {
            szhj5 = Instantiate(hj5);
            szhj5.transform.parent = GetHand.transform;
            szhj5.transform.localPosition = new Vector3(0, 0, 8);
            }
            if(!sz5)
            {
                szhj10 = Instantiate(hj10);
                szhj10.transform.parent = GetHand.transform;
                szhj10.transform.localPosition = new Vector3(0, 0, 3 );
            }
        }

    展开全文
  • 在做项目的时候,难免会碰到UI很多的情况,而动态加载UI就是一个很重要的问题。...对于初学者往往会遇到UI加载出来,设置子物体后发现UI不见了,但是明明直接拖到UI层次中又是对的。这个问题就和第二个参数相关

     写在前面:

    在做项目的时候,难免会碰到UI很多的情况,而动态加载UI就是一个很重要的问题。而动态加载UI就需要考虑到设置UI的父子关系。通常我们会使用transform.setparent(transform)来设置父子关系。到这里都还是没毛病。但是偏偏UI在设置父子关系的时候需要考虑到第二个参数。对于初学者往往会遇到UI加载出来,设置子物体后发现UI不见了,但是明明直接拖到UI层次中又是对的。这个问题就和第二个参数相关。

    worldPositionStays。所以这也是一个需要思考的问题。

     

    UI设置父物体的原因分析

    在加载UI中,这个加载步骤其实是首先将UI实例加载到场景的根路径中,然后再设置到父物体中。这个过程可以用手工实现,先加UI拖到场景根路径中,然后在拖到父物体下,此时显示的效果就是最后的效果。

    原因:在从根路径拖到父物体这个过程中,就发生了坐标的转化。具体分析和解决方法看下文。

     

    setparent()

    这里首先对这个函数进行分析。这个函数有两个重载:

    public void SetParent(Transform parent);
    public void SetParent(Transform parent, bool worldPositionStays);
    第一个是我们常用的只有一个参数的函数,第二个是加了一个是否保持世界坐标系的布尔型变量。
    API中对于第二个参数的定义如下:
    worldPositionStays If true, the parent-relative position, scale and rotation are modified such that the object keeps the same world space position, rotation and scale as before.

    官方解释大意是:如果为真,那么就保持之前的位置、旋转量、缩放值。而为否,的时候则保持局部坐标的位置、旋转、缩放。

    直接可能不太能理解这个参数的意思,所以就往后看。

    由此引发的问题

    通常我们在设置父子关系的时候,我们希望设置完后,子物体要保持原来的样子。如果变了样,那么就会对游戏的交互产生较为严重的影响。3D物体相对还好,UI在设置父物体如果没有设置好会出现很严重的变形。

    worldPositionStays

    下面对这个参数带来的影响做了对比试验:

    测试场景:

    球体作为父物体,方块作为子物体,分别的参数:

          

     选择方块作为子物体能够看出变化。

    首先参数为true。

    效果保持不变。球体和方块的局部坐标值分别为:

      

    可以看到在效果上保证了方块不随球体的变化而变化,但是其局部坐标值发生了变化,以球体为中心,但在效果上仍然是之前的相对位置。

    其次参数为false

    从效果上,可以看出方块的旋转和缩放值已经发生了变化,不在保存原来的世界坐标系中的位置。球体和方块的局部坐标值分别为:

       

    从参数上可以看出,方块在局部数值上保证了和之前全局坐标系中的数值相同。

    可以看出产生的影响还是较大的。

    对于UI

    对于UI来说,我们是希望保留这种位置关系还是不保留呢?答案很明显,我们在做UI预设时是在UI的父物体下完成,保存到预设中的值也是UI局部坐标系中的值。

    首先加载到场景根路径时,此时UI将之前局部坐标系的值换成全局坐标系。

    要保证和之前UI一样,我们需要将这种位置关系带到UI父物体中。

    于是应该设置为false。

     

    测试效果://UI来源蛮牛教程

    设为true:

     

    设为false:

     

    THISSKY出品,原文链接:http://www.cnblogs.com/zhuhongjongy/p/7226386.html

     

    展开全文
  • 前段日子学了Unity官网的拾荒者Scanverges,之后突发奇想想做一个重新开始的按钮,但是由于是代码实例化对象,而且要删除子父物体,且要通过代码给新实例化的物体添加脚本,所以网上查了一些资料,自己在此进行总结...

    前段日子学了Unity官网的拾荒者Scanverges,之后突发奇想想做一个重新开始的按钮,但是由于是代码实例化对象,而且要删除子父物体,且要通过代码给新实例化的物体添加脚本,所以网上查了一些资料,自己在此进行总结希望能够获得更多的进步。

    删除子父物体的代码有两种:

    ① 第一种是在一个不会被销毁与隐藏渲染的物体上添加代码进行查找与删除:

    /// 脚本位置:将此脚本挂载到不会被销毁与不会被隐藏的物体身上  

    /// 脚本功能:删除需要删除的物体与其子物体  

        public void DestroyPrtAndSon()

        {

            if (parentObject == null)

                parentObject = GameObject.Find("Board").gameObject;

     

            for (int i = 0; i < parentObject.gameObject.transform.childCount; i++)

                Destroy(parentObject.gameObject.transform.GetChild(i).gameObject);

     

            Destroy(parentObject.gameObject);

        }

     

    ② 第二种是建立两个脚本,把子父物体的代码添加到各自的物体上,然后进行删除,这种也是要通过GameObject.Find的查询语句找到相应的物体添加代码才能够实现,代码如下:

    /// 脚本位置:将此脚本挂载到父物体A身上  

    /// 脚本功能:发送广播给自己和自己的所有子物体  

    public class DestoryParent : MonoBehaviour {

        void Start()

        {

            // 执行Start方法后会发送一个广播  

            // 广播会从自身开始查找这个DestoryMe方法,查找完自身后会查找所有子物体  

            BroadcastMessage("DestoryMe");

        }

    }

    /// 脚本位置:每个需要被销毁的子物体身上  

    /// 脚本功能:销毁自身

    public class DestorySon : MonoBehaviour {

        // 作为被广播通知的方法,由父物体通知执行  

        public void DestoryMe()

        {

            Destroy(gameObject);

        }

    }

     

    关于代码添加脚本的代码如下:

    //如果要添加其他的属性,也能通过AddConponent<属性名>()去实现

    public void AddScripts()

    {

        GameObject gameObject = new GameObject();

        gameObject.AddComponent<DestoryParent>();               //添加绑定脚本

        Destroy(gameObject.GetComponent("DestoryParent"));      //删除脚本

    }


    同时,我通过代码更改物体的Layer和Tag,可以更快捷的找到与处理相关的物体,下面是通过代码更改物体Layer与Tag的相关代码:

    public void ChangeTagOrLayer()

    {

    parentObject.layer = LayerMask.NameToLayer("CouldDestory"); //改变Layer的值

         parentObject.tag = "Board"; //改变Tag的值

    }

    /*需要注意的是,在更改LayerTag 的时候,更改的值必须是添加已经存在的LayerTag,不然就会报错,如果需要根据更改的LayerTag而在Unity中动态添加相应的属性,那么就必须使用代码进行相应的创建,目前尚无涉及,在接下来的一星期,准备进行动态TagLayer的学习,到时学习心得一并上传*/

     

     

    展开全文
  • unity3d 设置子物体

    2013-02-26 13:44:59
    public Transform fatherOb; private void Start() { transform.parent = fatherOb; } //倒过来,就是把对方设置父物体
  • 物体和父物体的移动同步 首先明确一个概念,物体的坐标是以父物体为原点而计算的 在上图中,绿色球的坐标是(-2.62,6.3,0)这是相对于世界坐标原点。而作为它的物体cube,cube的坐标是相对坐标,相对于绿色的...
  • 在UI模块中获取UI游戏物体已用来切换,通过遍历获取并添加到集合,省去了代码中游戏物体的定义和查找实例化.
  • 酷跑片段本来想做三条轨道,然后通过切换轨道来做,后面发现一种巧妙的方法,利用物体的父级偏移来实现轨道的切换。 比如上图,实际运动的是Car对象,通过修改MineControler的左右位置(要根据本地的方向哈)就...
  • 物体上的方法: public void blockDestroy() ...在父物体上调用此方法 parentObj.BroadcastMassage("blockDestroy");  .BroadcastMessage  原型:public void BroadcastMessage(s
  • GameObject obj = GameObject.Find("Image Bg");  //首先找到父物体  GameObject zhen = obj.transform.Find("zhen").gameObject;  //然后找到父物体下的物体
  • using UnityEngine; using System.Collections; public class ResourcesLoadObj : MonoBehaviour { void Start() { foreach (Transform child in gameObject.transform) { Deb
  • 从网上也没有找到合适的解决办法,只是调整物体的LocalScal也无法解决这个问题,只是想起了以前的LookAt朝向轴无法更改时,加入了一个空物体来调整这个轴,所以用一个空物体作为金币的父物体,再将地形做为空物体的...
  • 参考资料: Unity3D研究院之自动计算所有...二、解决上面链接源码的问题,如:父物体物体们相差非常大(1000以上)就不能一次性解决本章标题所说问题 using System.Collections.Generic; using UnityEdito...
  • Unity3D 如何获取当前物体为第几个子物体 快下班了,没想到今天能写两篇新发现。 不多说,直接上代码了: print(transform.GetSiblingIndex());//显示当前物体为第几个子物体 ...
  • 开发过VR的朋友想必都遇到过(尤其是Htc-Vive),明明自己在VR游戏内将玩家控制器放到了一个默认的特定视角,但真正运行游戏的时候,位置总是跑偏。尤其是环境周围有其他物体...所以一般设置默认视角,都是把父物体拖到
  • GameObject aa;//父物体 Transform fu = aa.GetComponentInChildren< Transform>(); foreach (Transform item in fu) { print(item.name); }
  • 添加一个类,挂到物体的父物体上.如下 using System.Collections; using System.Collections.Generic; using UnityEngine; public class BaseWallControl : MonoBehaviour {  // Use this for initialization  ...
  • 实验:在界面中创建两个物体:cube 和 sphere
  • [MenuItem("SaveTransInfo/GetUIChildPath #`")] static void GetUIChildPath() { GameObject obj = Selection.activeGameObject; Transform trans = obj.transform;... listParNam...
  • sing UnityEngine; using System.Collections; public class GameSchedule : MonoBehaviour {  private GameObject UI;  void Awake()  {  UI = GameObject.Find("UIRoot"); ...vo
1 2 3 4 5 ... 20
收藏数 1,999
精华内容 799
关键字:

unity3d 设置子父物体