unity的一些算法(持续更新)

跑酷篇

获取两点之间的某点的位置

startPoint为起始点

endPoint为终点

numZ是一个距离(例如:在这个路径上,startPoint.z+numZ 就是要获取的点的z)

公式为:

  Vector3 getPoint= Vector3.Lerp(startPoint.position,endPoint.position,(numZ-startPoint.position.z)/(endPoint.position.z-startPoint.position.z));

  (注:ae/ab=cd/cb=ed/ac  三者的比例相同 , 其中 cd的值为numZ , cb的值为 endPoint.z-startPoint.z ,所以通过上列公式就可以得出指定路径中所需的指定numZ的那一个点 )

两点之间的距离

(A.position-B.position).sqrMagnitude或(A.position-B.position).magnitude 

注:sqrMagnitude与magnitude 的区别,magnitude 直接得出距离值,sqrMagnitude得出的是距离的平方(?)不开根号,所以sqrMagnitude运算速度略快

按照指定速度向目标点前进


public float moveSpeed = 100f;//每秒的移动距离

Vector3 targetPos ;//目标点
Vector3 moveDir = targetPos - this.transform.position;//移动方向
// moveDir.normalized * moveSpeed * Time.deltaTime 每帧的移动向量 【moveDir.normalized (将向量进行单位化,单位化就是把这个向量,方向不变,长度变为1)】
transform.position += moveDir.normalized * moveSpeed * Time.deltaTime;

摄像机跟随人物移动

   Transform player;

    Vector3 offset=Vector3.zero;//偏移量

    public float moveSpeed = 10f;//摄像机的移动速度
    void Awake()
    {
        player = GameObject.FindGameObjectWithTag(Tags.player).transform;

        offset = transform.position - player.position ;
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 targetPos = player.position + offset;
        transform.position= Vector3.Lerp(transform.position, targetPos, moveSpeed*Time.deltaTime);//参数顺序很重要
    }

Animation.IsPlaying() 与 Animation.isPlaying 的区别 

animation.IsPlaying() 与 animation.isPlaying 的区别,animation.IsPlaying()判断当前是否在播放某段动画,animation.isPlaying 判断当前是否正在播放动画(任何)

详细来说就是,animation.IsPlaying("Idle_1") 判断当时是否正在播放 Idle_1 这段动画,animation.isPlaying判断当前Animation这个组件是否有在播放任意动画。

Animation.Play()与Animation.PlayQueued()的区别

animation.Play("Idle_1");是马上播放Idle_1
animation.PlayQueued("Idle_2");在Idle_1播放完毕后,播放Idle_2

 获取鼠标点击位置

Input.mousePosition

跳跃(只控制上下,未设置前后方向的移动)

在跳跃中,分成上升和下降两段过程

首先需要设置几个变量值

    private Transform player;//要跳跃的物体
    public bool isJumping = false;//当前是否正处于跳跃状态
    private bool isUp=false;//当前是否正在上升(在跳跃状态中,上升时为true,下落时为false)
    public float jumpHeight = 20f;//最终要达到的跳跃高度
    public float jumpSpeed = 10f;//跳跃的升降速度
    float haveJumpHeight=0;//当前已经跳跃的高度

设置完了以后要先获取到需要跳跃的物体,然后在触发跳跃时更改开关参数

    if (isJumping == false)//判断当前是否正处于跳跃状态
    {
          isJumping = true;
          isUp = true;
          haveJumpHeight = 0f;
    }

根据开关参数来控制当前物体的跳跃

void Update(){
     if (isJumping)
        {
            float yMove = jumpSpeed * Time.deltaTime;
            if (isUp)//上升过程
            {
                player.position = new Vector3(player.position.x, player.position.y+yMove, player.position.z);
                haveJumpHeight += yMove;
                if(Mathf.Abs(jumpHeight - haveJumpHeight) <= 0.5f)
                {
                    player.position = new Vector3(player.position.x, player.position.y + (jumpHeight - haveJumpHeight), player.position.z);
                    isUp = false;
                    haveJumpHeight = jumpHeight;
                }
            }
            else//下降过程
            {
                player.position = new Vector3(player.position.x, player.position.y - yMove, player.position.z);
                haveJumpHeight -= yMove;
                if (Mathf.Abs(haveJumpHeight) <= 0.5f)
                {
                    player.position = new Vector3(player.position.x, player.position.y -  haveJumpHeight, player.position.z);
                    isJumping = false;
                    haveJumpHeight = 0f;
                }
            }
        }
}
原文地址:https://www.cnblogs.com/lingLuoChengMi/p/11983021.html