unity3d人物跳_Unity3D_(游戏)跳一跳超简单制作过程

跳一跳

工程文件界面

a6b57e3ac8892314dba91165b140baad.gif

游戏界面

12735d0afd37b3be370bb12c4d025a74.png

脚本

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

usingDG.Tweening;usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.SceneManagement;usingUnityEngine.UI;public classPlayer : MonoBehaviour {public float Factoer=1;public float MaxDistance = 4;publicGameObject Stage;//获取相机位置

publicTransform Camera;privateRigidbody _rigidbody;private float_stateTime;publicGameObject Particle;publicTransform Head;publicTransform Body;//当前盒子物体

privateGameObject _currentStage;privateCollider _lastCollisionCollider;//相机的相对位置

publicVector3 _camerRelativePosition;publicText ScoreText;private int_score;

Vector3 _direction= new Vector3(1, 0, 0);//Use this for initialization

voidStart () {

_rigidbody= GetComponent();

Particle= GameObject.Find("yellow");

Particle.SetActive(false);//修改物理组件的重心到body的底部

_rigidbody.centerOfMass =Vector3.zero;

_currentStage=Stage;

_lastCollisionCollider= _currentStage.GetComponent();

SpawnStage();

_camerRelativePosition= Camera.position -transform.position;

}//Update is called once per frame

voidUpdate () {if(Input.GetKeyDown(KeyCode.Space))

{

_stateTime=Time.time;

Particle.SetActive(true);

}if(Input.GetKeyUp(KeyCode.Space))

{var elapse = Time.time -_stateTime;

OnJump(elapse);

Particle.SetActive(false);

Body.transform.DOScale(0.1f,1);

Head.transform.DOLocalMoveY(0.29f,0.5f);

_currentStage.transform.DOLocalMoveY(0.25f,0.2f);

_currentStage.transform.DOScale(new Vector3(1,0.5f,1),0.2f);

}if(Input.GetKey(KeyCode.Space))

{

Body.transform.localScale+= new Vector3(1, -1, 1) * 0.05f *Time.deltaTime;

Head.transform.localPosition+= new Vector3(0,-1,0)*0.1f*Time.deltaTime;//盒子缩放沿着轴心缩放

_currentStage.transform.localScale += new Vector3(0, -1, 0)*0.15f*Time.deltaTime;

_currentStage.transform.localPosition+= new Vector3(0, -1, 0) * 0.15f *Time.deltaTime;

}

}void OnJump(floatelapse)

{

_rigidbody.AddForce((new Vector3(0,1,0)+_direction)*elapse*Factoer,ForceMode.Impulse);

}voidSpawnStage()

{var stage =Instantiate(Stage);

stage.transform.position= _currentStage.transform.position + _direction * Random.Range(1.1f,MaxDistance) ;var randomScale = Random.Range(0.5f,1);

Stage.transform.localScale= new Vector3(randomScale, 0.5f, randomScale);

stage.GetComponent().material.color = new Color(Random.Range(0.01f, 1), Random.Range(0.01f, 1), Random.Range(0.01f, 1));

}//如果有别的物体和本物体发生变化,会触发这函数

voidOnCollisionEnter(Collision collision)

{if(collision.gameObject.name.Contains("Stage") && collision.collider!=_lastCollisionCollider)

{

_lastCollisionCollider=collision.collider;

_currentStage=collision.gameObject;

RandomDirection();

SpawnStage();

MoveCamera();

_score++;

ScoreText.text=_score.ToString();

}if(collision.gameObject.name=="Ground")

{//本局游戏结束,重新开始

SceneManager.LoadScene("Gary");

}

}voidRandomDirection()

{var seed = Random.Range(0,2);if(seed == 0)

{

_direction= new Vector3(1, 0, 0);

}else{

_direction= new Vector3(0,0,1);

}

}voidMoveCamera()

{

Camera.DOMove(transform.position+ _camerRelativePosition,1);

}

}

Player.cs

Player.cs

程序已放到Github上托管(里面有个32bit可执行文件):传送门

小游戏没有用到素材、资源包(DOTween插件不算)

一个脚本

实现过程

【脚本中public外部引用的控件需要自己拖拽到相应位置上!!!】

创建一个3D场景

3c1d8e90e346fbd5f3263573c00e7ba6.png

创建一个Cube,y轴缩放0.25当跳板,创建物体可以通过Transsform中Reset设置为3D场景正中心,在创建一个Plane当地面,跳一跳小人物碰到地面时游戏借宿,为了让跳板出现地面上方,设置y轴Postion为0.25(Reset设置居中是以组件正中心)

创建一个材质球改变地面颜色(默认Pllane控件是不能设置材质颜色)

345cda2be67e21593b7ee8b1c1f667a3.png

创建玩家角色

c903e7f0c482f17af6fa9b359cb0a016.png

Cylinder(圆柱形)控件作为玩家身体

Sphere(圆形)控件作为玩家头部

添加材质球,将材质球绑定到Cylinder(圆柱形)控件和Sphere(圆形)控件上,改变材质球颜色

保存场景

a395b790e665c280d22b1244f9267a04.png

角色跳跃

添加游戏脚本Player,并将降本绑定到Player控件上,并在Player控件上添加一个物理组件Rigidbody

4ad38682b10f339ad1d01f544f87ba42.png

获得组件

privateRigidbody _rigidbody;voidStart () {

_rigidbody= GetComponent();

}

计算出按下空格(space)和松开空格之间的时间

private float_stateTime;voidUpdate () {if(Input.GetKeyDown(KeyCode.Space))

{

_stateTime=Time.time;

}if(Input.GetKeyUp(KeyCode.Space))

{var elapse = Time.time -_stateTime;

OnJump(elapse);

}

}

Player主键跳跃的距离

public float Factoer=1;void OnJump(floatelapse)

{

_rigidbody.AddForce(new Vector3(1,1,0)*elapse*Factoer,ForceMode.Impulse);

}

af1a25819247c0181578e20b9fd90d3c.gif

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;public classPlayer : MonoBehaviour {public float Factoer=1;privateRigidbody _rigidbody;private float_stateTime;//Use this for initialization

voidStart () {

_rigidbody= GetComponent();

}//Update is called once per frame

voidUpdate () {if(Input.GetKeyDown(KeyCode.Space))

{

_stateTime=Time.time;

}if(Input.GetKeyUp(KeyCode.Space))

{var elapse = Time.time -_stateTime;

OnJump(elapse);

}

}void OnJump(floatelapse)

{

_rigidbody.AddForce(new Vector3(1,1,0)*elapse*Factoer,ForceMode.Impulse);

}

}

Player.cs

发现人物跳跃落地时会出现跌倒,这是因为Body底部是圆的

将Body下的Capsle Collider去掉,替换成Box Collider

ade13ac6fa858c833fca6cd0c46a237f.png

通过Player.cs修改Player

voidStart () {

_rigidbody= GetComponent();//修改物理组件的重心到body的底部

_rigidbody.centerOfMass =Vector3.zero;

}

f5cf4eeaa49497379f78815d0c917d90.gif

修改当前视角,选中Main Camera按下快捷键Ctrl+Alt+F  (GameObject->Align With->View)

3bfd7879b664a91e889d908ba56645db.png

修改Factoer为3,测试(这个盒子是我自己复制Stage出来的)

6a3a3bcb3b3b49a0b7ec62fcbafbb406.gif

盒子自动生成

随机生成盒子位置

stage.transform.position = _currentStage.transform.position + new Vector3(Random.Range(1.1f,MaxDistance),0,0);

privateRigidbody _rigidbody;private float_stateTime;//当前盒子物体

privateGameObject _currentStage;voidStart () {

_rigidbody= GetComponent();//修改物理组件的重心到body的底部

_rigidbody.centerOfMass =Vector3.zero;

_currentStage=Stage;

SpawnStage();

}voidSpawnStage()

{var stage =Instantiate(Stage);

stage.transform.position= _currentStage.transfor

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值