【unity基础】场景中物体的位移

整理自​​​​​​5.4.2Transform 与坐标系-Transform 场景物体的变_哔哩哔哩_bilibili

物体的移动方式

1.按照世界坐标

2.按照本地坐标

3.按照其他物体的坐标

脚本的实现方式

1. 直接改变position

void Update{
    this.transform.position = new Vector3(transform.position.x, transform.position.y + 1.5f * Time.deltaTime, transform.position.z);
}

 transform可以调用的接口函数和变量

 坐标系-变量

    public enum MoveDirection {idle,right,up,forward};
    public MoveDirection direction; 

    // Update is called once per frame
    void Update()
    {
        if(direction == MoveDirection.idle){
            GetComponent<Rigidbody>().velocity = Vector3.zero;
        }
        if(direction == MoveDirection.right){
            GetComponent<Rigidbody>().velocity = transform.right * 1;
        }
        if(direction == MoveDirection.up){
            GetComponent<Rigidbody>().velocity = transform.up * 1;
        }
        if(direction == MoveDirection.forward){
            GetComponent<Rigidbody>().velocity = transform.forward * 1;
        }
    }

 坐标系-函数

public GameObject target;
// Start is called before the first frame update
void Start()
{
    
}

// Update is called once per frame
void Update()
{
    if(Input.GetKey(KeyCode.Q)){
        target.transform.position = transform.TransformPoint(0,0,2);
        //使target实时跟随当前挂载的物体
        target.transform.parent = transform;
        //设置使target不再接受动力学模拟
        target.GetComponent<Rigidbody>().isKinematic = true;
    }
    if(Input.GetKey(KeyCode.E)){
        //判断当前target是否仍为当前挂载物体的子物体
        if(target.transform.parent == this.transform){
            //如果是当前挂载物体的子物体,则先设置让其接受动力学模拟
            target.GetComponent<Rigidbody>().isKinematic = false;
            //使target与当前挂载物体不再为父子结构
            transform.DetachChildren();//使当前挂载物体与其所有子物体断绝父子关系
            
            //Transform.TranformDirection
            //声明一个方向
            Vector3 camDirect = transform.TransformDirection(0,0,10);
            target.GetComponent<Rigidbody>().AddForce(camDirect,ForceMode.Impulse);//施加的力方向,施加的力类型(冲量)

        }
    }
}

2. 使用Translate方法:

//按照本地坐标来移动
this.transform.Translate(0, 1.5f*Time.deltaTime, 0, Space.Self);
//按照世界坐标移动
this.transform.Translate(0, 1.5f*Time.deltaTime, 0, Space.World);
//按照其他物体的坐标移动,其中cube为脚本中定义的游戏物体变量,在Inspector面板已经为其赋值了场景中其他的物体
this.transform.Translate(0, 1.5f*Time.deltaTime, 0, cube.transform);

(当前脚本挂载在需要移动的物体上)

3.使用AnimationCurve:

//animCurve是脚本中声明的一个,public AnimationCurve animCurve;
outputY = animCurve.Evaluate(Time.time);
this.transform.position = new Vector3(transform.positon.x + 1 * Time.deltaTime, outputY, transform.positon.z);
//还可以调节这个运动的幅度,如
outputY = animCurve.Evaluate(Time.time / 2f) * 2f;

练习:使物体匀速运动到目标地点

//target是声明好的一个代表目标地点的游戏物体
void Update(){
    MoveToTarget(target.tranform.positon);
}

void MoveToTarget(Vector3 targetPos){
    //Distance函数计算两个位置之间的距离
    if(Vector3.Distance(transform.positon, targetPos)<1){
        Vector3 direction = targetPos - transform.position;
        direction = direction.normalized;
        //得到了目标方向,接下来进行位移操作
        this.transform.Translate(direction * Time.deltaTime, Space.World);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值