《今日学习整理之关于数组、函数调用》

来源:互联网 发布:应用程序是软件么 编辑:程序博客网 时间:2024/05/06 18:56


由于要控制物体移动并且旋转到某一特定位置,但是由于物体比较多,所以如果对物体一个一个写代码则是一种笨方法。所以,今天用到了数组与循环结构。先附上代码:

using UnityEngine;

using System.Collections;

 

public class NewBehaviour2 : MonoBehaviour {

 

    public Transform[] objArray;

    public Transform[] poPointArray;

 

    public float speedMove = 10;

    public float speedRolate = 10;

bool enable =false;

public follow1 Follow;

private int numIndex;

 

// Use this for initialization

void Start () {

Follow = GameObject.Find("Main Camera").GetComponent<follow1>();

}

// Update is called once per frame

void Update () {

 

 

        for(int i =0;i<objArray.Length;i++)

{

if(Follow.hitTransform==objArray[i])

{

enable =true;

numIndex =i;

Follow.hitTransform=null;

Debug.Log("123");

}

}

if(enable)

{

enable = !PointMoveTo(objArray[numIndex],poPointArray[numIndex]);

}

}

 

    private bool PointMoveTo(Transform transStart, Transform transEnd)

    {

    if (transStart.position == transEnd.position)

{

  

  return true;

}

        transStart.position = Vector3.MoveTowards(transStart.position, transEnd.position, Time.deltaTime * speedMove);

transStart.localRotation = Quaternion.RotateTowards(transStart.localRotation,transEnd.localRotation,Time.deltaTime *speedRolate);

        return false;

    }

 

}

 

对于这种要控制好多物体移动旋转到目标位置的项目,我们首先整理好思路,首先,我们应该想到这样的情形是不是应该用到数组,1、关于数组的定义我们可知,数组是一组有序数据的集合2、用一个数组名和下标能唯一地确定数组中的元素3、数组中的每一个元素都属于同一个数据类型。我们会想到,这每个物体都是移动位置与旋转角度发生变化,那么也就是说物体的Transform发生了变化,每一个物体都是这样的,那么我们会想到每个物体都是Transform这个类型发生变化,所以我们可以得知我们要控制的是每个物体的Transform,这下可以确定我们要用到相同的数据类型,符合括号中的第三点要求。用到数组,自然要用到循环结构,否则数组便发挥不出作用。我们这里要用到for循环。

我们来分析下代码:

才开始的时候定义了几个变量,由于在构思的过程中我们要对物体的Transform进行改变,控制物体从初始位置到达目的为止并且做相应的旋转,所以我们先定义了一个初始位置的Transform,一个目标位置的Transform,由于是多个物体的Transform,所以我们想到数组,则加上数组的定义规范,写成

public Transform[] objArray;

public Transform[] poPointArray;

接着,因为我们要物体的Transform改变时有个渐进的过程,所以自然会想到加上速度这个变量(移动速度,旋转速度),所以有:

public float speedMove = 10;

public float speedRolate = 10;

还要定义什么变量?如果现在想不到(缺乏经验),那么就在要用到的时候再去定义。

由于每个物体都要进行Transform的改变,所以我们可以先写一个关于Transform的从原始位置到达目标位置的函数,这样一来到时候直接调用函数就可以控制Transform变化了。

  private bool PointMoveTo(Transform transStart, Transform transEnd)

    {

    if (transStart.position == transEnd.position)

{

  

  return true;

}

        transStart.position = Vector3.MoveTowards(transStart.position, transEnd.position, Time.deltaTime * speedMove);

transStart.localRotation = Quaternion.RotateTowards(transStart.localRotation,transEnd.localRotation,Time.deltaTime *speedRolate);

        return false;

    }

我们在这个函数的括号中先定义好变量类型,我们知道到时传参所需的是变量类型是Transform,这个函数返回的类型是bool类型的。我们在函数里写上功能语句:

transStart.position = Vector3.MoveTowards(transStart.position, transEnd.position, Time.deltaTime * speedMove);

transStart.localRotation=Quaternion.RotateTowards(transStart.localRotation,transEnd.localRotation,Time.deltaTime *speedRolate);

由于这个函数返回的是bool型变量,我们在里面写上判断语句:

  if (transStart.position == transEnd.position)

{

  return true;

}

  return false;

这样一来,如果物体初始的position与目标的position相等的时候,返回true,至于这个true什么时候用,接下来看。

我们已经写好了移动旋转的功能,但是这个功能在调用的时候要获取到物体的原始位置与目标位置才能触发。目标位置好解决,我们只要在unity引擎中创建一个空物体,把这个空物体任意拖拽到目标位置处就可以了。那么原始位置呢?原始位置就是物体在场景中的初始位置,但是怎么获取到这个Transform,其实这个Transform就是鼠标点击发出的射线与物体发生碰撞获取到的物体的Transform,当这个获取到的Transform与物体的Transform相等的时候,按常理来说这时候便可以调用移动旋转的函数了。但是我们要了解到,射线只碰撞一下就消失,所以也就在碰撞的那一下调用了这个函数,所以移动旋转也只是在射线碰撞的短瞬间起作用,这样效果是不对的,所以我们想到可以在射线碰撞的时候发送出一个信号,只要这个信号一直存在那么移动旋转的函数就会一直调用,当这个信号消失的时候函数不调用。我们可以定义一个bool变量enable,,在射线碰撞触发时将enable置为truetrue的时候调用移动旋转函数,当移动到目标位置的这个动作完全完成的时候再将其置为false。由于移动旋转函数里当原始位置=目标位置的时候返回true,即PointMoveTo(objArray[numIndex],poPointArray[numIndex])这里面的两个参数如果相等的话,返回的就是true,现在假设动作已经完成了,里面的两个参数相等了,这时要把enable置为false,则只需要写上这样一句代码:enable = !PointMoveTo(objArray[numIndex],poPointArray[numIndex]);前面加个!即可。

关于代码:

 

 

 

  for(int i =0;i<objArray.Length;i++)

{

if(Follow.hitTransform==objArray[i])

{

enable =true;

numIndex =i;

Follow.hitTransform=null;

Debug.Log("123");

}

}

其中的 numIndex =i;是用来保存当前所点击的物体的,因为在for循环的外部我们用到了 enable = !PointMoveTo(objArray[numIndex],poPointArray[numIndex]);这样一句话,所以我们要设置一个int型变量来保存我们获取到的物体。

Follow.hitTransform=null;这句话的作用是防止鼠标点击发出的其他射线干扰。

 

 

 

0 0
原创粉丝点击