2018-07-08 20:50:39 u012997311 阅读数 3536

新建一个cube 作为地面。

新建一个Sphere

点击add component 选择刚体


新建脚本 Sphere 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shpere : MonoBehaviour {

    private Rigidbody rd;//刚体变量
    private int force = 5;//力量
	// Use this for initialization
	void Start () {
        rd = GetComponent<Rigidbody>();
	}
	
	// Update is called once per frame
	void Update () {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        rd.AddForce(new Vector3(h, 0, v)*5);
	}
  
    
}

附加到sphere 上就可以控制小球运动了。根据方向键控制。


2015-03-18 21:40:03 xiaoben_mao 阅读数 1118

新建一个plane作为地面Land,一个小球。给小球增加Rigidbody组件,设置一个阻力值Drag,此处我们设为1。

然后给小球增加一个script,此处为moveController.cs

using UnityEngine;
using System.Collections;

public class moveController : MonoBehaviour {

	public float speed;	//	小球运动速度
	
	Vector3 targetPos;	//	目标位置
	
	void Awake () {
		targetPos = transform.position;
	}
	
	void Update () {
		GetTargetPos ();
		//	判断小球有没有到达目标点
		if (Vector3.Distance (targetPos, transform.position) >= 0.05f) {
			//	使小球朝向目标点
			transform.LookAt (targetPos);
			//	使小球运动
			transform.Translate (Vector3.forward * speed * Time.deltaTime);
		}
	}
	
	//	获取目标点
	void GetTargetPos () {
		//	1.	监听鼠标点击事件
		if (Input.GetMouseButtonDown (0)) {
			//	2.	获取从摄像机向鼠标当前位置发出的射线
			Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
			//	3.	创建一个用于保存碰撞信息的变量
			RaycastHit hitInfo = new RaycastHit ();
			//	4.	调用函数发射射线检测有没有碰撞到游戏对象
			if (Physics.Raycast (ray, out hitInfo)) {
			//	5.	判断发生碰撞的游戏对象是不是地板
				if (hitInfo.collider.gameObject.name == "Land") {
			//	6.	如果是地板,获取碰撞点的坐标
					targetPos = hitInfo.point;
			//	修改目标点的 Y 值
					targetPos.y = transform.position.y;
					Debug.Log ("targetPos" + targetPos);
				}
			}
		}
	}
}

给小球设置一个滚动到速度Speed。

效果为点击绿地上点一点,小球会移动到鼠标点击点。




在游戏中可以实现游戏人物随着鼠标移动

2017-07-14 16:41:41 GaoHeShun 阅读数 842

在场景中创建一个小球,这个小球就是平衡游戏的主角,让小球滚动来,通过控制滚动的方向来实现平衡.

搭建场景如下:

给小球添加刚体和Sphere Collider

:

然后简单粗暴上脚本:挂载到Ball上

using UnityEngine;
using System.Collections;

public class BallMovement : MonoBehaviour {		// attach this script to ball

	// Use this for initialization, change values in Inspector for tweaking
	
	public float normalForce = 200.0f;
	public float boostForce = 15000.0f;
	public float maxSpeed = 50.0f;

	private GameObject ball;
	private bool boostActive;
	private Vector3 ballStartPosition;
	private Vector3 ballDirection, ballForward; 
	private Vector3 ballPosition1, ballPosition2; // used to determine the effective movement of the ball between updates
	private float directionHorizontal, directionVertical;
	private float distanceToGround; // used to check if ball is on ground

	
	void Start () {
	
		distanceToGround = GetComponent<Collider>().bounds.extents.y + 0.1f;  // 初始化并增加安全系数以解释不平整的地面
		ballStartPosition = transform.position;  // 存储启动位置在水平复位的情况下
		ballPosition1 = transform.position;	//初始化运动向量,用来计算方向向量

		 

		ball = GameObject.FindGameObjectWithTag(Tags.ball);
		if (ball == null) {Debug.LogError ("<color=blue>Marble Kit error:</color>: There needs exactly one object with the tag 'Ball' in the scene");}
		
	}
	
	
	
	
	void Update () // 在player上创建运动矢量
	{  
	
				
		directionHorizontal = Input.GetAxis("Horizontal");
		directionVertical = Input.GetAxis("Vertical");
						
		ballDirection.x = directionHorizontal;
		ballDirection.z = directionVertical;
		ballDirection.y = 0;

		boostActive = Input.GetKey("space");  // 添加一个加速的判断
						
	}
	

	void FixedUpdate()  // physics is executed during FixedUpdate, so we use this too
	{

		GetComponent<Rigidbody>().AddForce(ballDirection * normalForce * Time.deltaTime);  // add force/speed to ball in vector direction
		ballDirection = Vector3.zero;								       // 然后重置  否则力将持续不断的应用
		
		
		ballPosition2 = transform.position;  // create a forward vector = direction the ball moves effectively between updates. I found the .direction method not to yield good results
		ballForward = ballPosition2 - ballPosition1;//创建一个正向向量=球在更新之间有效移动的方向。我发现,不会产生好结果的方向的方法
		

		if (boostActive && BallIsGrounded())  // 满足点击键盘空格键的布尔值,和在地面上
		{	
			ballForward.y = 0;
			GetComponent<Rigidbody>().AddForce(ballForward * boostForce * Time.deltaTime);
		}
		
		if (GetComponent<Rigidbody>().velocity.magnitude > maxSpeed)  // 限制最大速度
		{
			GetComponent<Rigidbody>().velocity = GetComponent<Rigidbody>().velocity.normalized * maxSpeed;
		}
	
	
		ballPosition2 = ballPosition1;	// 更改矢量以允许下一个球方向检查。
		ballPosition1 = transform.position;
	}

	public void ResetBallPosition()
	{
		this.transform.position = ballStartPosition;
		this.GetComponent<Rigidbody>().velocity = Vector3.zero;
		ball.SetActive(true);


	}

	bool BallIsGrounded() // checks if ball is on ground
	{
		return Physics.Raycast(transform.position, -Vector3.up, distanceToGround);

	}
	
}

应用实例:平衡小球

平衡小球Demo下载:点击打开链接

http://download.csdn.net/detail/gaoheshun/9899079


2018-08-25 17:45:48 weixin_43053831 阅读数 862

基本流程


**
0、在基础的地面上会有一个小球,通过控制小球的滚动,吞吃地面上的一些小块。
1、创建基础场景,包括地面,主角,触碰小块。

① 通过材质设置修改相关物体的颜色/光滑度等显示。
② 重复出现的游戏物体最好设置成prefab,以方便修改。
③ 小球上需要添加刚体组件,以模拟物理效果。
④ 触碰小块上添加PickUp标签,用于判断。

2、创建脚本,实现对游戏主角的控制,镜头对主角的跟随,主角触碰小块小块消失(吞食)的功能。

① 在脚本中定义一个刚体,并通过获取组件上的刚体对其赋值。
    private Rigidbody rd;
    //在start()模块中对其进行赋值。
    rd = getComponent<Rigidbody>();
② 通过对这个刚体施加力,对主角进行控制。
    float h = getAxisRaw("Horizontal");
    float v = getAxisRaw("Vertical");
    rd.AddForce(new Vector3(h,0,v));

③ 镜头的跟随,脚本挂在在相机上。首先定义一个gameObject,并将其和工程中的Player联系起来。
    public gameObject PlayerTransform;
④ 记录初始化时主角和相机的偏移量,在持续运行时加上偏移量。
    //在start()模块中
    offset = transform.position - PlayerTransform.position;
    //在Update()模块中,更新相机位置
    transform.position = PlayerTransform.position + offset;

⑤ 吞吃小球,有两种方式,一种是碰撞检测,但会有明显的触碰效果,第二种是触发检测,将触碰小快的碰撞盒修改成触发器(is Trigger)。
    //触碰检测
    void OnCollisionEnter(Collision collision){
        if(collision.collider.tag == "PickUp"){
            Destroy(collision.collider.gameObject);
        }
    }
    //触碰检测
    void OnTriggerEnter(Collider collider){
        if(collider.tag == "PickUp"){
            Destroy(collider.gameObject);
        }
    }

3、创建UI界面的显示内容,包括一个计数量score,一个完成时的提示量win。

4、在脚本中实现score的计数功能,和win的条件显示功能。

① 首先引入新的环境(?),using UnityEngine.UI;
② 得分计数的实现,因为是对游戏物体的text组件进行修改,所以定义一个text变量,用以和项目中对应的组件联系起来。
    public Text text;
    private int score;//计数变量

    score++;//在每次检测到加分条件时,score+1

    text.text = score;//完成赋值
③ 获胜提示,在满足条件的情况下,对winText进行一个激活操作。同样定义一个gameObject变量,和工程中的物体联系起来。
    public gameObject winText;

    winText.setActive();

5、游戏的发布(将需要构建的scene场景拖入到build的窗口中)

总结


**
1、善用unity提供的manual,当中包括很多class,需要一一熟悉。
2、脚本工程和游戏工程的联系需要定义,使用物体即用gameObject,使用组件即定义组件名称,获取组件通常使用gameObject.getComponent<>();

2015-02-01 23:25:28 Carl180 阅读数 1896
一:准备资源
      
           该文章出自【狗刨学习网】
    两张贴图:地图和小球贴图。

            

二:导入资源

    在Assets下建立resources文件夹,然后将贴图导入。

     
     

三:建立场景游戏对象

    1.建立灯光:

     
     

    2.创建一个相机,配置默认。

     

    3.建立一个Plane用来表示地面,将导入的地面图片付给Plane。

     
     

    4:建立一个小球,并为其添加一个刚体,因为之后会通过重力感应为小球添加外部作用力,所以需要有刚体组件。

     
     

三:创建脚本

    1.控制小球运动的脚本:首先要将手机的重力感应控件坐标转换为游戏世界的空间坐标。

      

     建立一个C#脚本:

      
  1. <font color="#000000" face="宋体" size="3">using UnityEngine;
  2. using System.Collections;

  3. public class BallControl : MonoBehaviour
  4. {
  5.         //移动速度
  6.         public int speed = 10;
  7.     
  8.         void Update ()
  9.         {
  10.                 //建立一个向量变量,将手机向量坐标改变为游戏向量坐标
  11.                 Vector3 dir = Vector3.zero;
  12.                 dir.z = Input.acceleration.y;
  13.                 dir.x = Input.acceleration.x;

  14.                 //钳制加速度向量到单位球
  15.                 if (dir.sqrMagnitude > 1)
  16.                         dir.Normalize ();

  17.                 //使它每秒移动10米,而不是每帧10米
  18.                 dir *= Time.deltaTime;
  19.         
  20.                 // Move object 移动物体
  21.                 rigidbody.AddForce (dir * speed, ForceMode.Force);
  22.         }
  23. }</font>
复制代码



    将这个脚本附加给小球:

     

    Speed:小球运动的速度。

    2.控制相机脚本,使相机跟随小球移动

          

  1. <font color="#000000" face="宋体" size="3">using UnityEngine;
  2. using System.Collections;

  3. public class CameraControl : MonoBehaviour
  4. {
  5.         public Transform target;
  6.         public int relativeHeight = 10;
  7.         public int zDistance = 1;
  8.         public int dampSpeed = 1;
  9.     
  10.         // Update is called once per frame
  11.         void Update ()
  12.         {
  13.                 Vector3 newPos = target.position + new Vector3 (0, relativeHeight, -zDistance);
  14.                 transform.position = Vector3.Lerp (transform.position, newPos, Time.deltaTime * dampSpeed);
  15.         }
  16. }</font>
复制代码


    然后将这个脚本附加给相机:
     

    Target:指向小球物体。
    Relative Height:相机的相对高度
    ZDistace:Z轴相对的距离。
    Damp Speed:物体移动的时候,相机跟随物体的速度。

最后运行如下:

     

滚动的盒子

阅读数 752

没有更多推荐了,返回首页