Unity3D中C#脚本的基础语法(1)

一、位移与旋转

一般对物体的位移与旋转操作都是通过修改对象的Transform(变换属性)和Rigidbody(刚体属性)组件参数来实现的。

旋转:

使用Rotate方法

public class BNUTransR : MonoBehaviour {
    void Update(){
        this.transform.Rotate(2,0,0);    /*绕x轴每帧旋转2°(x轴,y轴,z轴)
                                           在Rotate方法中数字为旋转度数而非速度*/ 
    }
}

位移:

使用Translate方法

public class BNUTransT : MonoBehaviour{
    void Update(){
        this.transform.Translate(0,0,1);    //每帧朝z轴方向移动1个单位长度

    }
}

 关于单位长度的设定在Edit菜单的Snap Settings中。

普通物体和添加了刚体组件的物体都可以使用tranrform变换下的Translate函数进行移动的。不过添加刚体组件的物体具备物理属性,受力后会有移动旋转碰撞,都是通过物理引擎进行计算的,这时这类物体如果再同时使用变换方式进行移动,就会出错。

二、有关时间的方法

在Unity中需要记录时间的功能都需要用到Time类,其中最重要的变量就是deltaTime(为只读变量),它代表了最近一次调用FixedUpdate或者Update方法到现在的时间。

如果想要在不考虑帧率的情况下匀速的完成一个效果,就可以乘以Time.deltaTime。(也就是说帧率会产生影响)

假如物体涉及到了刚体,那么就需要写在FixedUpdate方法中且乘以fixedDeltaTime。(因为Rigidbody涉及到了物理运算,所以要用物理的时间而非以帧率为标准)

例:匀速移动物体的刚体

public class BNUFUpdtae: MonoBehaviour
{
    public GameObject gameObject;    //声明游戏对象
    void FixedUpdate()
    {
        Vector3 te = gameObject.GetComponent<Rigidbody>().transform.position;    //创建一个位置坐标te(向量),把对象的刚体的位置赋予te(获取对象刚体的位置)
        te.y += 5 * Time.fixedDeltaTime;    //让te每秒上升5个单位
        gameObject.GetComponent<Rigidbody>().transform.position = te;    //再把te的位置附回给对象的刚体(使刚体移动)
    }
}

三、获取其他对象的方法

1.获取带有层次关系的游戏对象

场景中的物体必定存在父子关系,如果想通过脚本来控制父物体或者子物体,就需要用到Transform组件。

获取子物体:transform.Find("子物体名称")

当获取到子物体后,还可以继续通过GetComponent方法来获取子物体的其他组件。

获取父物体:transform.parent

因为一个物体的父物体肯定只有一个,所以不需要根据特定名字来查找。

例:通过查找使子物体和父物体旋转

我们创建三个物体,Cube1、Cube2及Cube3,层级从小到大。

public class BNUParchild : MonoBehaviour
{
    void Update()
    {
        this.transform.Find("Cube1").Rotate(1, 0, 0);    //找到子对象Cube1,并将其沿x轴旋转
        this.transform.parent.Rotate(1, 0, 0);           //找到父对象,并将其沿x轴旋转
    }
}

只需将该脚本附挂在Cube2上,即可让父子物体旋转了。

2.通过名字或标签获取游戏对象

GameObject.Find    通过名字获取对象

GameObject.FindWithTag    通过标签获取对象

例:通过查找名字和标签获取对象并使他们旋转

创建两个物体,Cube和Capsule,并给Capsule添加一个Cap标签。

public class BNUFind : MonoBehaviour
{
    void Update()
    {
        GameObject obj1 = GameObject.Find("Cube");    //获取Cube
        obj1.transform.Rotate(1, 0, 0);	
        GameObject obj2 = GameObject.FindWithTag("Cap");    //获取Capsule
        obj2.transform.Rotate(1,0,0);										

    }
}

3.通过组件名来获取游戏对象

FindObjectOfType<组件名称>()FindObjectsOfType<组件名称>()方法是专门用来查找包含所指定组件的对象的。第一种只能获取到查找到的第一个对象,而第二个可以获取所有包含该组件的对象。

例:打印带有同一个Test脚本组件的对象名称

public class BNUFindtype : MonoBehaviour
{

    void Start()
    {
        Test test = FindObjectOfType<Test>();		        //获取第一个找到的“Test”组件
        Debug.Log(test.gameObject.name);			//打印挂载“Test”组件的第一个游戏对象的名称
        Test[] tests = FindObjectsOfType<Test>();		//获取所有的“Test”组件
        foreach (Test te in tests)
        {
            Debug.Log(te.gameObject.name);			//打印挂载“Test”组件所有的游戏对象的名称
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值