iLeichun

当前位置:首页Unity3d

Unity某个类访问另一个类成员的几种方式

分类:Unity3d  来源:网络  时间:Jul 25, 2019 3:00:01 PM

Unity中的脚本大多数都是绑定到某个游戏对象中,那么某个类要如何才能访问到另一个类的属性和方法?下面提供几种方式,供参考:


方式1:设置被调用类为单例

public class PlayerAttack : MonoBehaviour {  

    public static PlayerAttack _instance; // static关键字,单例模式   

  

    void Awake(){  

        _instance = this;// 确保在使用前已被初始化  

    }  

  

    public void TakeDamage(int damage){  // 可被外部调用的方法

          

    }  

}


public class Enemy : MonoBehaviour {

   void Attack(){      // 当敌人攻击主角时

      PlayerAttack._instance.TakeDamage(20);

   }

}


方式2:设置被调用类的属性、方法为static

public class PlayerAttack : MonoBehaviour {  

    public static void TakeDamage(int damage){  // 可被外部调用的方法

          

    }  

}


方式3:使用GameObject的SendMessage()

public class PlayerAttack : MonoBehaviour {  

    public void TakeDamage(int damage){  // 可被外部调用的方法

          

    }  

}


public class Enemy : MonoBehaviour {  

    void Attack(){  

      // 主角模型的tag为PlayerBoy

        GameObject p = GameObject.FindGameObjectWithTag("PlayerBoy");

        p.SendMessage("TakeDamage", 20);  

    }  

}


方式4:获取到某个对象的Script组件

这个脚本放在cube上 

public class Score : MonoBehaviour {  

    public  int allScore=100;  

    void Update () {  

       ...

    }  

}  


访问Score.allScore

public class Text : MonoBehaviour {  

    public GameObject Obj1;  

    void Start () {  

       Obj1 = GameObject.Find("Cube");  

       Score script=Obj1.GetComponent<Score>(); // 取对象的Script组件

       Debug.Log(script.allScore);   

    }  

}  


VS找不到UnityEngine、UnityEngine.UI等引用的解决办法

分类:Unity3d  来源:网络  时间:Jan 9, 2019 3:46:15 PM

当打开别人的项目或者自己的项目在其他电脑上打开时,VS中可能会出现找不到Unity库的问题,这往往是由于不同电脑中Unity安装目录不相同导致的。会出现下图所示的情况:

11.png


打开某个类后也会出现找不到引用类的情况,如

22.png


要解决这个问题就得让VS能正确找到每个引用的位置,可以有3种方法:


一、手动在VS中添加引用

如下图所示,首先得找到dll文件所在的位置,才能导入。这种方式比较繁琐。

33.png


20190109_154417_0752.png


二、Unity中设置

如下图所示,先把脚本编辑器改成MonoDevelop,然后用MonoDevelop随便打开一个脚本,打开后可以关闭MonoDevelop

55.png


66.png


再把脚本编辑器改成VS,

77.png


再用VS打开脚本的时候发现引用正常了

8.png


三、修改配置文件

用文本编辑器打开工程目录下面的 Assembly-CSharp.csproj、Assembly-CSharp-Editor.csproj 两个文件,对里面的所有不正确的路径进行修改即可

9.png


总结:

其实方式一、二最终都是要修改 Assembly-CSharp.csproj、Assembly-CSharp-Editor.csproj 这两个配置文件,只是比方式三更可视化一些。方式二最简单,是利用MonoDevelop来自动修改上述配置文件,但是如果没有安装MonoDevelop或者采用该方式失败的时候就只有改用其他方式了。总之,不管使用哪种方式,适合自己的就是最好的,每个人都有不同的爱好。


Unity3d之Hinge Joint组件

分类:Unity3d  来源:网络  时间:Dec 19, 2017 4:29:03 PM

链接两个物体,两个物体的运动互相牵连;

blob.png

此处两个物体均需要有Rigidbody组件;假设有A、B两个新物体,均没有Rigidbody组件,则:

(1)若给A添加Hinge Joint组件,会自动添加Rigidbody组件;

(2)当给A链接B时,若B没有Rigidbody组件,将不会出现在选择列表中,无法链接;

(3)当A已经链接B时,若尝试删除A的Rigidbody组件,则会提示无法删除,必须要先手动移除Hinge Joint组件,才能删除Rigidbody组件;

blob.png

(4)当A已经链接B时,若删除B的Rigidbody组件,则A中的链接源会显示已丢失;

blob.png

(5)也可以给B新增链接到C,此时3个物体的运动均受到牵连;当然B也可以链接到A(由于A已链接到B,所以这个链接是多余的,效果不受影响);

(6)若已给B添加Hinge Joint组件,但没设置链接源,则A、B均保持静止;

(7)A、B物体的Use Gravity均不勾选时,A、B均保持静止,否则有一个勾选,两个物体均会运动;

blob.png

unity3d查找某个游戏对象的三种方法

分类:Unity3d  来源:网络  时间:Dec 8, 2017 4:15:38 PM

unity3d查找某个游戏对象有三种方法,分别是Find、FindWithTag、FindGameObjectsWithTag,每种方法各有特色

(1)GameObject.Find()

blob.png

// Sphere为游戏对象名称,区分大小写

GameObject sp = GameObject.Find("Sphere");

//判断是否为空

if(sp != null)

{

...

}

该方法的执行效率低,最好不要在update中调用;否则,最好用FindWithTag()替代


(2)GameObject.FindWithTag()

blob.png

// Sphere1为游戏对象tag,区分大小写

GameObject sp = GameObject.FindWithTag("Sphere1");

需要先给组件设置一个tag,若有多个相同tag的对象,则只取第一个对象


(3)GameObject.FindGameObjectsWithTag()

获取具有相同tag的游戏对象数组,需要循环处理数组

GameObject[] sp = GameObject.FindGameObjectsWithTag("Sphere1");


Unity3d 5.x中导入资源的三种方法

分类:Unity3d  来源:网络  时间:Nov 11, 2017 10:59:26 PM

Unity3d 5.x中导入资源有三种方法,掌握导入资源的多种方法有利于日后的熟练操作。


方法1、

从文件夹中直接拖动到project面板中;


方法2、

project面板的Assets右键菜单中->Import New Asset...

blob.png


在弹出窗口中选中需要导入的资源,再点击右下角的Import按钮

20171111_225621_0875.png


方法3、

project面板的Assets右键菜单中->Import Package->Custom Package...

blob.png


在弹出窗口中选中需要导入的资源,再点击右下角的Import按钮

Unity3d实时获取当前位置的地形高度

分类:Unity3d  来源:网络  时间:Sep 2, 2017 11:49:17 PM

如果要把一个游戏对象放置在地形的某个固定的位置,代码里面直接写死也是可以的。但这样很不方便,

其一、要经过多次的调试才能放到指定位置,特别是y坐标,太大了太小了得到的效果都不是很逼真;

其二、对于运动的物体(例如一直往前走的人物角色),由于地形高度不是一样的(除非是一个平面),当走到高山的时候脚就被埋了,当走到低洼的地方脚就浮起来了;

 

要解决这种问题,就有必要实时获取当前地形的高度,unity3d提供了Terrain.activeTerrain.SampleHeight()函数用来获取指定点的地形高度,其原型为:

public float SampleHeight(Vector3 worldPosition);

参数worldPosition表示当前位置,由于要实时获取地形高度,所以这个参数也要实时获取,因此应该写在Update方法中,示例代码如下:

void Update () {

        Vector3 pos = transform.position;              // 获取当前游戏对象的位置

        pos.y = Terrain.activeTerrain.SampleHeight(pos);    // 获取当前位置的地形高度

        transform.position = pos;      

}