待实现:在较小的斜坡上可以站住不动,在大的斜坡上会一直下滑,下滑时无法正常跑动

办法1:在2-4的基础上,加入坡度判断,用法线向量来表示
声明变量hitNormal
我们在重力代码中控制重力变化的部分加入条件
//条件1:不走&&坡度60||条件2:跳
if (Input.GetAxisRaw("Horizontal") == 0 && hitNormal.y > 0.5f || Input.GetAxisRaw("Vertical") != 0)
    {
        gravity = 0;
    }
条件中的0.5是60度坡的cos,也就是坡度小于60度

实现下滑跑动禁止
首先在update中加条件
        if (hitNormal.y < 0.5f)
        {
            velocity = new Vector2(0f, 0f);
        }
再修改一下重力代码,使下滑时的重力大些
        if (isTouched == false)
        {
            gravity += 5f;
        }
        else
        {
            gravity = 60;
            getTop = false;
            if (velocity.x == 0 && hitNormal.y > 0.5f || velocity.y != 0)//条件1:不走&&坡度60||条件2:跳
            {
                gravity = 0;
            }
            if (velocity.x != 0 && tangentDirection.y > 0)
            {
                gravity = 20;
            }
            if(hitNormal.y < 0.5f)
            {
                gravity = 100;
            }
        }

又发现一个问题:由于斜面坡度判断,同一片地上两个方向行走时重力不同,导致鼠标冲跳时的初速度不同
在鼠标冲跳代码中加入gravity = 0;
    void MouseController()
    {

if (!Input.GetMouseButton(0))
        {
            mouseLocation = Input.mousePosition;
        }
        if (Input.GetMouseButton(0) && (mouseLocation - Input.mousePosition).magnitude >= 20)
        {
            if (isTouched == true)
            {
                jumpDirect = (Input.mousePosition - mouseLocation).normalized;
                if (jumpDirect.y > 0 && inAir == 0)
                {
                    gravity = 0;
                    //jumpShortOrLong = 2;
                    velocityMouse = 0.3f;
                    inAir = 1;
                    isTouched = false;
                }
            }

}
    }

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(Collider2D))]
public class SnowField02 : MonoBehaviour
{private const float MIN_MOVE_DISTANCE = 0.001f;private new Collider2D collider2D;private new Rigidbody2D rigidbody2D;private ContactFilter2D contactFilter2D;private readonly List<RaycastHit2D> raycastHit2DList = new List<RaycastHit2D>();private readonly List<RaycastHit2D> tangentRaycastHit2DList = new List<RaycastHit2D>();public LayerMask layerMask;//[HideInInspector]public Vector2 velocity = Vector2.zero;public float velocityMouse = 0f;public Vector2 tangentDirection = Vector2.zero;public Vector2 hitNormal = Vector2.zero;//BaseControllerMouseMovepublic Vector3 mouseLocation = Vector3.zero;public Vector2 jumpDirect = Vector2.zero;public int inAir = 0;public float gravity = 60;public bool isTouched = false;public bool getTop = false;private Vector3 theScale = new Vector3(0.5f, 0.5f, 1);void Start(){collider2D = GetComponent<Collider2D>();rigidbody2D = GetComponent<Rigidbody2D>();if (rigidbody2D == null)rigidbody2D = gameObject.AddComponent<Rigidbody2D>();rigidbody2D.hideFlags = HideFlags.NotEditable;//rigidbody2D.bodyType = RigidbodyType2D.Kinematic;rigidbody2D.simulated = true;rigidbody2D.useFullKinematicContacts = false;rigidbody2D.collisionDetectionMode = CollisionDetectionMode2D.Continuous;rigidbody2D.sleepMode = RigidbodySleepMode2D.NeverSleep;rigidbody2D.interpolation = RigidbodyInterpolation2D.Interpolate;rigidbody2D.constraints = RigidbodyConstraints2D.FreezeRotation;rigidbody2D.gravityScale = 0;contactFilter2D = new ContactFilter2D{useLayerMask = true,useTriggers = false,layerMask = layerMask};}private void OnValidate(){contactFilter2D.layerMask = layerMask;}private void Update(){if (isTouched == true){velocity = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));}if (hitNormal.y < 0.5f){velocity = new Vector2(0f, 0f);}}private void FixedUpdate(){Movement(velocity * Time.deltaTime * 5f);MouseController();if (isTouched == false && inAir == 1){inAir = 2;}if (isTouched == true && inAir == 2){inAir = 0;velocityMouse = 0f;mouseLocation = Input.mousePosition;}rigidbody2D.position += jumpDirect * velocityMouse;}private void Movement(Vector2 deltaPos){Vector2 deltaPosition = deltaPos + new Vector2(0, gravity * gravity * Time.deltaTime * -0.001f) ;Vector2 updateDeltaPosition = Vector2.zero;float distance = deltaPosition.magnitude;Vector2 direction = deltaPosition.normalized;if (distance <= MIN_MOVE_DISTANCE)distance = MIN_MOVE_DISTANCE;if (rigidbody2D.Cast(direction, contactFilter2D, raycastHit2DList, distance) == 0){isTouched = false;}else{isTouched = true;}Vector2 finalDirection = direction;float finalDistance = distance;foreach (var hit in raycastHit2DList){float moveDistance = hit.distance;hitNormal = hit.normal;Debug.DrawLine(hit.point, hit.point + hitNormal, Color.white);Debug.DrawLine(hit.point, hit.point + direction, Color.yellow);//float projection = Vector2.Dot(hitNormal, direction);if (projection >= 0){moveDistance = distance;}else{tangentDirection = new Vector2(hitNormal.y, -hitNormal.x);float tangentDot = Vector2.Dot(tangentDirection, direction);if (tangentDot < 0){tangentDirection = -tangentDirection;tangentDot = -tangentDot;}float tangentDistance = tangentDot * distance;if (tangentDot != 0){rigidbody2D.Cast(tangentDirection, contactFilter2D, tangentRaycastHit2DList, tangentDistance);foreach (var tangentHit in tangentRaycastHit2DList){Debug.DrawLine(tangentHit.point, tangentHit.point + tangentDirection, Color.magenta);if (Vector2.Dot(tangentHit.normal, tangentDirection) >= 0)continue;if (tangentHit.distance < tangentDistance)tangentDistance = tangentHit.distance;}updateDeltaPosition += tangentDirection * tangentDistance;}}if (moveDistance < finalDistance){finalDistance = moveDistance;}}updateDeltaPosition += finalDirection * finalDistance;rigidbody2D.position += updateDeltaPosition;if (isTouched == false){gravity += 5f;}else{gravity = 60;getTop = false;if (velocity.x == 0 && hitNormal.y > 0.5f || velocity.y != 0){gravity = 0;}if (velocity.x != 0 && tangentDirection.y > 0){gravity = 20;}if(hitNormal.y < 0.5f){gravity = 100;}}if ((jumpDirect * velocityMouse + deltaPosition).y < 0 && getTop == false && isTouched == false){gravity = 60;jumpDirect.y = 0;velocity.y = 0;getTop = true;}}void MouseController(){if (!Input.GetMouseButton(0)){mouseLocation = Input.mousePosition;}if (Input.GetMouseButton(0) && (mouseLocation - Input.mousePosition).magnitude >= 20){if (isTouched == true){jumpDirect = (Input.mousePosition - mouseLocation).normalized;if (jumpDirect.y > 0 && inAir == 0){gravity = 0;//jumpShortOrLong = 2;velocityMouse = 0.3f;inAir = 1;isTouched = false;}}}}
}

SnowField目标效果2-6:斜面移动2更真实的斜坡相关推荐

  1. 如何使用unity制作雷达探测目标效果动画

    如何使用unity制作雷达探测目标效果动画 如何用unity制作动画或者可以展示的软件 因为如今许多制作软件的引擎,虚幻,unity,寒霜等,unity更加便捷. 在官网www.unity3D.com ...

  2. CVPR2021(Oral) 商汤、港中文实现单目人脸重建新突破: 基于生成网络的渲染器!几何形状更精准!渲染效果更真实!...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 近日,商汤-港中文联合实验室提出基于风格化对抗生成器的人脸渲染器,用于取代传统图形学基于栅格化的渲染器 ...

  3. CVPR2021(Oral) 商汤、港中文实现单目人脸重建新突破: 基于生成网络的渲染器!几何形状更精准!渲染效果更真实!

    近日,商汤-港中文联合实验室提出基于风格化对抗生成器的人脸渲染器,用于取代传统图形学基于栅格化的渲染器来进行3D模型的重建.该方法构建了一种从输入3D模型到生成图像的平滑梯度,同时可以以低精度建模获得 ...

  4. 只看活动结案报告?营销活动效果你还能做的更好

    随着食品饮料行业销量增速下行,品牌主纷纷开始尝试快速迭代新产品,期望以产品升级的方式迎合消费者需求,通过营销手段的创新,在激烈的市场竞争中,抢占更有利的行业地位.一些品牌开始投入到微信.微博.KOL等 ...

  5. [业务题]货拉拉数据分析岗简答题, 评估优惠券促销活动的收益效果,评估哪种优惠券对企业更优

    如题: 货拉拉会经常给用户发放不同的折扣券.假设有三种类型的折扣券A, B, C :这三种折扣券同时通过APP直接发放给玩家们,且每张折扣券的优惠程度,有效日期大致一样.用户可以在一次同时使用多种优惠 ...

  6. shader 反射 水面_【博物纳新】水面涟漪反射效果开源库测评

    [博物纳新]是UWA重磅推出的全新栏目,旨在为开发者推荐新颖.易用.有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目.前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性.很多时 ...

  7. PaddlePaddle第二周学习笔记

    项目一:使用飞浆完成手写数字识别模型 MNIST数据集 MNIST数据集是从NIST的Special Database 3(SD-3)和Special Database 1(SD-1)构建而来. 构建 ...

  8. PaddlePaddle课程学习第二周笔记

    本周主要学习了手写数字识别以及深度学习五个步骤的具体实现方法和优化 深度学习五个步骤的具体实现方法和优化 数据集处理 读入数据并划分数据集 train_set(训练集):用于确定模型参数. val_s ...

  9. 自定义控件其实很简单 三

    上一回关羽操刀怒砍秦桧子龙拼命相救,岂料刘备这狗贼耍赖以张飞为祭品特殊召唤黑暗大法师消灭了场上所有逗逼,霎时间血流成河,鲜红的血液与冰冷的大地融合交汇在一起焕发出血液的煞气--那么,问题来了,请问这是 ...

最新文章

  1. pth大小为0,占用空间不为0
  2. find linux 目录深度_linux 查找目录或文件
  3. GeoHash -------寻找附近人
  4. 【今日CV 视觉论文速览】16 Nov 2018
  5. ubuntu下安装psycopg2报错
  6. vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb
  7. POJ 3080 - Blue Jeans
  8. [转]Kinect for Windows SDK开发入门(七):骨骼追踪基础 下
  9. 检测移动设备(手机)的 PHP 类库
  10. parsley.js自定义验证规则之大小写
  11. c语言实现《学生管理系统》
  12. JSP九大内置对象及其作用域
  13. orbslam2稠密版建图
  14. 移动硬盘加密速度慢,取消;BitLocker加密不可逆;
  15. 有一台服务器,通过netstat -an命令看到大量状态SYN_RCVD的连接,可能发生的原因是什么?
  16. 饮用水中如何去除硝酸盐 溴化物 铬 等有害物质
  17. GprMax2D ——ABC(吸收边界条件)相关命令
  18. 【译】通过多线程技术提高Android应用性能
  19. python 红黑树_手把手教你43行代码写红黑树(包括删除操作)
  20. 数据有效性做下拉菜单

热门文章

  1. node中的cd命令,cd命令
  2. linux移植嵌入式系统,嵌入式系统学习——S3C2451之Linux移植步骤
  3. sdkman 的安装和使用
  4. 没有电池没有芯片,这些塑料瓶子正在联网
  5. 计算机科学与技术专业适合什么人,计算机科学与技术专业怎么样 主要学什么内容...
  6. 养生指南 2 : 中医的最高境界是养生 , 养生的最高境界是养心
  7. linux下不解包查看tar包文件内容
  8. 未来人工智能技术的应用领域有哪些?
  9. 计算机网络基础——应用层
  10. android 支付宝 收款,Android支付——支付宝支付