unity入门——实现一个简单的跑酷游戏
场景搭建
将人物放置于世界坐标的(0,0.1,0),初始道路放置于人物脚下,坐标设置为(0,0,0),水面初始位置设置为(0,-2,-100),可以自行调整,道路与人物在y轴上不要 重合即可,当然这些操作也可以放在Awake函数中动态进行,但直接摆放显然是最快捷的方法。
这时候点击运行游戏大概率什么也看不到,我们需要将摄像机放置于人物面前,按照如下设置其transform组件的属性。
这时点击运行会看到如下画面:
如果上一篇的动画状态机设置正确的话,人物应该会处于待机动画,而需要这个动画循环的话,只需要将该动画的Loop Time和其子属性Loop Pose勾选即可,如下。
那么,到现在场景的摆放基本完成,ui方面会在下篇说明。
人物控制
一款简单的跑酷游戏的人物需要有前进,跳跃,下滑和左右移动的动作,而人物在前进的同时需要摄像头跟随,这里就需要脚本实现了。
/*CameraPosition.cs,挂载于main camera*/
public GameObject character;
public float beh=4;//相机距离
public float ups=7;//相机高度
void LateUpdate()
{
if (start)
{
transform.position = character.transform.position - Vector3.forward * beh + Vector3.up * ups;
transform.LookAt(character.transform);
}
}
正如第一篇所说,相机的跟随需要 在人物位置改变之后,因此在LateUpdate中进行。
人物进入游戏后设置为奔跑状态。
public Animator playerAnimator;
public int framerate=30;
CharacterController ctrl;
bool isjumping = false;
bool issliding = false;
bool ismoving = false;
bool isleft = false;
bool isright = false;
public float speed = 5f;
public GameObject hard;//难度
public Vector2 screenaixY = new Vector2(0, 1);
public Vector2 screenaixX = new Vector2(1, 0);
Vector2 startpos;
Vector2 endpos;
bool isinput = false;
float angle;
void Start()
{
Transform pos;
pos=GetComponent<Transform>();
pos.position = new Vector3(0, 0.1f, 0);
ctrl = GetComponent<CharacterController>();
playerAnimator = GetComponent<Animator>();
playerAnimator.SetBool("MOVE", true);
}
接下来在Update函数中完成其他动作及其音效的触发。
#if UNITY_STANDALONE_WIN//如果是windows平台
if (Input.GetKeyDown(KeyCode.UpArrow) && (isjumping == false) && (issliding == false))
{
GetComponent<AudioSource>().clip = Resources.Load<AudioClip>("jump");
GetComponent<AudioSource>().PlayOneShot(GetComponent<AudioSource>().clip);
isjumping = true;
playerAnimator.SetBool("ISJUMP", true);
}
if (Input.GetKeyDown(KeyCode.DownArrow) && (isjumping == false) && (issliding == false))
{
GetComponent<AudioSource>().clip = Resources.Load<AudioClip>("slide");
GetComponent<AudioSource>().PlayOneShot(GetComponent<AudioSource>().clip);
issliding = true;
playerAnimator.SetBool("ISSLIDE", true);
}
if (Input.GetKeyDown(KeyCode.LeftArrow) && (!isright) && (!isleft))
{
isleft = true;
StartCoroutine(turnleft());
}
/*while(transform.position.x >= -f)
transform.position += new Vector3(-1, 0, 0)*Time.deltaTime*5;*/
if (Input.GetKeyDown(KeyCode.RightArrow) && (!isleft) && (!isright