Unity中的运动(二)——物理
本文内容
控制刚体小球的速度
通过跳跃支持垂直运动
检查地面及其角度
使用ProBuilder创建测试场景
沿着斜坡移动
1.刚体为了使球体在复杂的3D环境中移动,我们必须支持与任意几何图形的交互。我们将使用Unity现有的物理引擎,而不是自己实现。
与物理引擎结合可以使用两种通用方法来控制角色。首先是刚体方法,即通过施加力或改变其速度,使角色的行为像常规物理对象一样,而间接控制它。第二种是运动学方法,即在仅查询物理引擎以执行自定义碰撞检测的同时进行直接控制。
1.1刚体组件用第一种方式控制球体首先要向其添加一个刚体组件。可以使用刚体的默认配置。
添加刚体之后在代码中去掉位置约束,移动小球,小球可以经过平面边缘,但会掉下去
为防止小球掉下去我们可以围绕着平面造一堵墙,当小球视图移动到一个角落时,由于物理引擎和代码为定位球产生冲突,球会变得抖动。我们将其移入墙壁,PhysX会将其后推来解决碰撞,如果停止推动PhysX将使球体因为动量保持运动。
1.2控制刚体速率直接调整球的位置可以有效的使球移动,但有些情况我们需要对球施加力或调整球的速度来间接控制球。
我们需要访问球体的刚体 ...
剑指31-35
31 整数中1出现的次数(从1到n整数中1出现的次数)题目描述
求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1-13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
示例1
输入:
113
返回值:
16
思路:
将整数按位数分成3段,初始化4个值当前位cur,高位high,低位low,位数d
以2134为例若当前位是个位,high=213,low=0,cur=4,d=1。个位可以有213-0+1个1。cur=0时有213个1
若当前位是十位,high=21,low=4,cur=3 ,d=10。十位可以有214-0+1个1。cur=0时有210个1
若当前位是百位,high=2,low=34,cur=1,d=100。百位可以有234-0+1个1。cur=0时有200个1
可以推出cur=0时,1的个数=high*d
cur=1时,1的个数=high*d+low+1
c ...
剑指24-30
24 二叉树中和为某一值的路径题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
示例1
输入:
1{10,5,12,4,7},22
返回值:
1[[10,5,7],[10,12]]
示例2
输入:
1{10,5,12,4,7},15
返回值:
1[]
思路:
本题用到回溯法,先序遍历二叉树,遇到节点后判断是否为一条路径,若是则加入结果集中,不是则回溯到上一步。
123456789101112131415161718192021class Solution {public: vector<vector<int> > FindPath(TreeNode* root,int expectNumber) { vector<vector<int>> res; if(root==nullptr)return res; ...
剑指19-23
19 顺时针打印矩阵题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
示例1
输入:
1[[1,2],[3,4]]
返回值:
1[1,2,4,3]
思路:
设置4个边界值,判断上下左右是否越界,顺时针从数组外圈开始遍历,注意单行或单列的数组不能从右到左,从上到下遍历。
1234567891011121314151617181920class Solution {public: vector<int> printMatrix(vector<vector<int> > matrix) { int row=matrix.size(); int col=matrix[0].size(); vector<int> res; if(r ...
剑指16-18
16 合并两个排序的链表题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
示例
输入
1{1,3,5},{2,4,6}
输出
1{1,2,3,4,5,6}
思路:
比较两个链表当前指针值的大小,小的那个加到新链表中,指针后移。循环遍历只要有一个链表为空,将剩下的链表添到新链表后面。
1234567891011121314151617181920class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode node(0); ListNode *res=&node; while(pHead1!=nullptr&&pHead2!=nullptr){ if(pHead1->val<pHead2->val){ ...
Unity对象管理(一) ——持久化对象
1.按需创建对象我们可以在游戏中任意创造物体,例如子弹发射,敌人,随机道具生成等,但当我们退出游戏再次进入时,Unity不会自动为我们记录过程当中的变化,需要我们自己去做。
本例中我们会创建一个非常简单的游戏,在按下一个键时随机生成一个立方体。只要我们能够跟踪不同游戏会话之间的立方体,就可以在此基础上增加游戏的复杂性。
1.1 准备工作我们需要一个Game组件脚本控制生成立方体,因此它需要包含一个public字段来连接一个预置实例
1public Transform cubePrefab;
创建一个空物体将脚本挂在上面,在创建一个cube的预制体,给脚本一个它的引用
1.2 玩家输入游戏应该根据玩家的输入来生成立方体,所以必须要检测玩家的输入。这里可以利用Unity的输入系统来检测按键,我们设置按下C建时生成立方体,通过在脚本中添加一个KeyCode字段实现
12345public KeyCode creatKey;private void Awake() { creatKey = KeyCode.C; }
在Update方法中通过Inp ...
剑指11-15
11 二进制中1的个数题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
示例1
输入:
110
返回值:
12
思路:
判断二进制末尾是否为1,将整数整体右移一位,循环32次
1234567891011class Solution {public: int NumberOf1(int n) { int num=0; for(int i=0;i<32;i++){ if(n&1==1)num++; n=n>>1; } return num; }};
12 数值的整数次方题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
思路:
指数为0时结果为1
指数为负数时结果为指数为正数时的倒数
指数为偶数时,式子等价于基数平方然后指数除 ...
剑指08-10
08 跳台阶题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路:
本题为斐波那契数列的变形,思路参考上题
123456789101112131415class Solution {public: int jumpFloor(int number) { int first=1,second=2; if(number==1)return 1; if(number==2)return 2; int current=0; for(int i=3;i<=number;i++){ current=first+second; first=second; second=current; } return current; }};
09 变态跳台阶题目描述
一只青蛙一次可以跳上 ...
python爬取天气
准备工作首先导入一些需要用到的库
123from bs4 import BeautifulSoup #网页解析import re #正则表达式import urllib.request,urllib.error #制定URL,获取网页数据
若没有所需的库命令行输入pip install 需要下载的库命,下载即可
代码分析
爬取网页
将需要爬取的网页网址保存起来,以银川为例
1baseUrl="http://www.nmc.cn/publish/forecast/ANX/yinchuan.html"
将网址传入到下面的函数中,获取网页源码,返回值为字符串
1234567891011121314151617#获取网页源码def askURL(url): # 模拟浏览器头部信息,向服务器发送消息 head={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0. ...
剑指05-07
05 用两个栈实现队列题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:
栈先进后出,队列先进先出
push操作时用stack1存放,pop操作时,若stack2为空则把stack1的值依次弹出放入stack2中,直到stack1为空,此时最早进来的元素到了stack2的栈顶,弹出即可,若stack2不为空则直接弹出栈顶元素。
12345678910111213141516171819202122232425262728class Solution{public: void push(int node) { stack1.push(node); } int pop() { int a; if(stack2.empty()){ while(!stack1.empty()){ a=stack1.top(); stack1.pop(); ...