Unity某个类访问另一个类成员的几种方式
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等引用的解决办法
当打开别人的项目或者自己的项目在其他电脑上打开时,VS中可能会出现找不到Unity库的问题,这往往是由于不同电脑中Unity安装目录不相同导致的。会出现下图所示的情况:
打开某个类后也会出现找不到引用类的情况,如
要解决这个问题就得让VS能正确找到每个引用的位置,可以有3种方法:
一、手动在VS中添加引用
如下图所示,首先得找到dll文件所在的位置,才能导入。这种方式比较繁琐。
二、Unity中设置
如下图所示,先把脚本编辑器改成MonoDevelop,然后用MonoDevelop随便打开一个脚本,打开后可以关闭MonoDevelop
再把脚本编辑器改成VS,
再用VS打开脚本的时候发现引用正常了
三、修改配置文件
用文本编辑器打开工程目录下面的 Assembly-CSharp.csproj、Assembly-CSharp-Editor.csproj 两个文件,对里面的所有不正确的路径进行修改即可
总结:
其实方式一、二最终都是要修改 Assembly-CSharp.csproj、Assembly-CSharp-Editor.csproj 这两个配置文件,只是比方式三更可视化一些。方式二最简单,是利用MonoDevelop来自动修改上述配置文件,但是如果没有安装MonoDevelop或者采用该方式失败的时候就只有改用其他方式了。总之,不管使用哪种方式,适合自己的就是最好的,每个人都有不同的爱好。
Unity3d之Hinge Joint组件
链接两个物体,两个物体的运动互相牵连;
此处两个物体均需要有Rigidbody组件;假设有A、B两个新物体,均没有Rigidbody组件,则:
(1)若给A添加Hinge Joint组件,会自动添加Rigidbody组件;
(2)当给A链接B时,若B没有Rigidbody组件,将不会出现在选择列表中,无法链接;
(3)当A已经链接B时,若尝试删除A的Rigidbody组件,则会提示无法删除,必须要先手动移除Hinge Joint组件,才能删除Rigidbody组件;
(4)当A已经链接B时,若删除B的Rigidbody组件,则A中的链接源会显示已丢失;
(5)也可以给B新增链接到C,此时3个物体的运动均受到牵连;当然B也可以链接到A(由于A已链接到B,所以这个链接是多余的,效果不受影响);
(6)若已给B添加Hinge Joint组件,但没设置链接源,则A、B均保持静止;
(7)A、B物体的Use Gravity均不勾选时,A、B均保持静止,否则有一个勾选,两个物体均会运动;
unity3d查找某个游戏对象的三种方法
unity3d查找某个游戏对象有三种方法,分别是Find、FindWithTag、FindGameObjectsWithTag,每种方法各有特色
(1)GameObject.Find()
// Sphere为游戏对象名称,区分大小写
GameObject sp = GameObject.Find("Sphere");
//判断是否为空
if(sp != null)
{
...
}
该方法的执行效率低,最好不要在update中调用;否则,最好用FindWithTag()替代
(2)GameObject.FindWithTag()
// Sphere1为游戏对象tag,区分大小写
GameObject sp = GameObject.FindWithTag("Sphere1");
需要先给组件设置一个tag,若有多个相同tag的对象,则只取第一个对象
(3)GameObject.FindGameObjectsWithTag()
获取具有相同tag的游戏对象数组,需要循环处理数组
GameObject[] sp = GameObject.FindGameObjectsWithTag("Sphere1");
Unity3d 5.x中导入资源的三种方法
Unity3d 5.x中导入资源有三种方法,掌握导入资源的多种方法有利于日后的熟练操作。
方法1、
从文件夹中直接拖动到project面板中;
方法2、
project面板的Assets右键菜单中->Import New Asset...
在弹出窗口中选中需要导入的资源,再点击右下角的Import按钮
方法3、
project面板的Assets右键菜单中->Import Package->Custom Package...
在弹出窗口中选中需要导入的资源,再点击右下角的Import按钮
Unity3d实时获取当前位置的地形高度
如果要把一个游戏对象放置在地形的某个固定的位置,代码里面直接写死也是可以的。但这样很不方便,
其一、要经过多次的调试才能放到指定位置,特别是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;
}
- 默认分类(20)
- J2EE(25)
- Java(56)
- PHP(55)
- SEO(10)
- 网页设计(20)
- 网站建设(37)
- 数据库(7)
- JavaScript(17)
- JQuery(6)
- MySQL(20)
- SQL Server(6)
- Access(1)
- Oracle(6)
- office(6)
- Dreamweaver(4)
- Photoshop(12)
- Flash(9)
- Fireworks(13)
- CSS(14)
- HTML(4)
- .NET(7)
- ASP(2)
- DB2(1)
- Ajax(2)
- Linux(12)
- Struts(7)
- Hibernate(8)
- Spring(2)
- Jsp(22)
- Asp(8)
- C#(3)
- C++(1)
- 网络安全(5)
- 软件工程(7)
- XML(1)
- English(2)
- 计算机等级考试(2)
- 计算机病毒(4)
- 个人日志(76)
- 互联网(15)
- ActionScript(10)
- Android(3)
- 数据结构与算法(1)
- 游戏策略(3)
- 美文翻译(2)
- 编程开发(19)
- 计算机应用(4)
- 计算机(10)
- Unity3d(6)
- 其他(1)
- egret(1)